1

假设我有一堂课(像这样):

public class User
{
   public Guid Id { get; set;}
   public DateTime CreationDate { get; set; }
   public string Name { get; set; }
   public UserGroup Group { get; set; } 
}

有没有办法获取不属于 .NET Framework 的所有属性类型。所以在这种情况下我只想得到UserGroup?那可能吗 ?

我能想到的最好的事情是:

IEnumerable<Type> types = typeof(User).GetProperties().Where(p => !p.PropertyType.Namespace.StartsWith("System.")).Select(t => t.PropertyType);

但这看起来像一个黑客工作。对不起,如果 dup,找不到类似的东西,并且对格式感到抱歉,我已经尽力了。

4

4 回答 4

1

我认为你所拥有的可能对你想要的足够可靠。但是,从灵活性/可读性的角度来看,定义您自己的属性类型可能会更好,您可以在属性级别应用,即

public class User
{
    public Guid Id { get; set; }
    public DateTime CreationDate { get; set; }
    public string Name { get; set; }
    [CustomProperty]
    public UserGroup Group { get; set; }
}

然后,您可以使用反射来查询具有此属性的所有属性。这将使您能够包含/排除任何属性。


抱歉,我忘了提到我无法修改域实体。(不能添加属性)。

您可以使用MetadataType将属性添加到基类,例如

class UserMetadata
{
    ...
    [CustomProperty]
    public UserGroup Group { get; set; }
}

[MetadataType(typeof(UserMetadata)]
public class DomainUser : User
{
}
于 2013-04-30T09:41:44.467 回答
1

反射总是某种黑客行为,所以是的,它感觉就像一个黑客工作。

但是分析实体,类,必须通过反射来完成。因此,您正在以正确的方式进行操作。

一个陷阱。您自己可以在命名空间“系统”中创建自己的类型。那会打乱你的搜索。您还可以分析属性类型的组装,但是您必须知道所有 .NET 程序集,这是一个很大的列表。

于 2013-04-30T09:49:58.500 回答
0

你所做的很好,你可以做这样的事情并利用该Except方法。

public static Type[] GetNonSystemTypes<T>()
{
  var systemTypes = typeof(T).GetProperties().Select(t => t.PropertyType).Where(t => t.Namespace == "System");
  return typeof(T).GetProperties().Select(t => t.PropertyType).Except(systemTypes).ToArray();
}
于 2013-04-30T09:50:33.917 回答
0

你的方法有效。我只想指出,您还可以尝试检查定义类型的程序集,例如检查它是否是从全局程序集缓存中加载的。

bool wasLoadedFromAssemblyCache = typeof(T).Assembly.GlobalAssemblyCache;
于 2013-04-30T20:06:39.290 回答