我想要明确地确定我的类型是自定义类类型(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类来检查公钥令牌.这取决于你的需要.