c# – 如何确定System.Type是否为客户端类型或框架类型?

我想要明确地确定我的类型是自定义类类型(MyClass)还是由Framework(System.String)提供的类型.

有没有办法反思我可以区分我的类类型与system.string或其他框架提供的类型?

解决方法

安全检查类型是否是程序集的一部分的唯一方法是检查程序集的全名,其名称,版本,文化和公钥(如果已签名).所有.Net基类库(BCL)都由微软使用其私钥签名.这使得任何其他人几乎不可能创建具有与基类库相同的完全限定名称的程序集.
//add more .Net BCL names as necessary
var systemNames = new HashSet<string>
{
"mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089","System.Core,PublicKeyToken=b77a5c561934e089"
};

var isSystemType = systemNames.Contains(objToTest.GetType().Assembly.FullName);

一个稍微不那么脆弱的解决方案是使用AssemblyName类,并跳过版本号/文化检查.这当然假定公钥在版本之间不会改变.

//add more .Net BCL names as necessary
var systemNames = new List<AssemblyName>
{
new AssemblyName ("mscorlib," +
                  "PublicKeyToken=b77a5c561934e089"),new AssemblyName ("System.Core,"+
                  "PublicKeyToken=b77a5c561934e089")
};

var obj = GetobjectTotest();

var objAN = new AssemblyName(obj.GetType().Assembly.FullName);

bool isSystemType = systemNames.Any(
        n =>  n.Name == objAN.Name 
           && n.GetPublicKeyToken().SequenceEqual(objAN.GetPublicKeyToken()));

大多数BCL已经签署了相同的密钥,但不是全部.您可以使用AssemblyName类来检查公钥令牌.这取决于你的需要.

相关文章

在要实现单例模式的类当中添加如下代码:实例化的时候:frmC...
1、如果制作圆角窗体,窗体先继承DOTNETBAR的:public parti...
根据网上资料,自己很粗略的实现了一个winform搜索提示,但是...
近期在做DSOFramer这个控件,打算自己弄一个自定义控件来封装...
今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都...
最近在研究WinWordControl这个控件,因为上级要求在系统里,...