如何将我创建的类型与具有反射的系统类型区分开来
本文关键字:类型 反射的 系统 区分开 创建 | 更新日期: 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))
-一旦您提出了自己的系统程序集列表(更实用)
编辑:根据评论,如果你对mscorlib
和System.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))
{
...
}