如何将我创建的类型与具有反射的系统类型区分开来

本文关键字:类型 反射的 系统 区分开 创建 | 更新日期: 2023-09-27 18:25:31

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

// 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的情况下进行比较。。。

如何将我创建的类型与具有反射的系统类型区分开来

什么算"系统"类型?您可以检查是否:

  • 它在mscorlib中
  • 它在Microsoft签名的程序集中
  • 它是一组固定的类型之一,你事先认为它是"系统"
  • 它在一组固定的程序集中,您事先认为它是"系统"
  • (很容易伪造)它的名称空间是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))
{
    ...
}