如何通过反射将我创建的类型区分为系统类型?

时间:2012-02-23 17:10:01

标签: c# reflection

我想知道我传递的类型是系统类型还是我创建的类型。我怎么知道这个?看:

// Obs: currentEntity can be any entity that i created
var currentProperties = currentEntity.GetType().GetProperties();

foreach (var property in currentProperties)
{
    if (/* Verify here if the property is a system type */)
    {
         // Do what i want...
    }
}

验证这一点的最佳方法是什么?

OBS:作为“系统类型”计算所有类型的核心标准库,在由Microsoft签署的程序集中,如:DateTime,String,Int32,Boolean(mscorlib.dll中的所有类型| System.dll)...

OBS2:我的实体不会继承这些“系统类型”。

OBS3:我的实体可以是我创建的任何类型,因此我无法在比较中指定。

OBS4:我需要进行比较而不指定它是否等于String,Boolean ...

1 个答案:

答案 0 :(得分:7)

什么算作“系统”类型?你可以检查一下:

  • 它在mscorlib
  • 这是在微软签署的程序集中
  • 这是您认为事先是“系统”的固定类型之一
  • 它是一组固定的程序集之一,你认为它是事先的“系统”
  • (易于伪造)其名称空间为System或以System.
  • 开头

一旦你通过“系统”定义了你的意思,这几乎就是用来检查它的代码。例如:

  • if (type.Assembly == typeof(string).Assembly)
  • var publisher = typeof(string).Assembly.Evidence.GetHostEvidence<Publisher>(); - 然后检查publisher是否拥有适用于Microsoft的正确证书
  • if (SystemTypes.Contains(type)) - 一旦您提出了自己的系统类型列表
  • if (SystemAssemblies.Contains(type.Assembly)) - 一旦你想出了自己的系统组件清单(更实用)

编辑:根据评论,如果您对mscorlibSystem.dll感到满意:

private static readonly ReadOnlyCollection<Assembly> SystemAssemblies = 
    new List<Assembly> {
        typeof(string).Assembly, // mscorlib.dll
        typeof(Process).Assembly, // System.dll
    }.AsReadOnly();

...

if (SystemAssemblies.Contains(type.Assembly))
{
    ...
}