微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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类来检查公钥令牌.这取决于你的需要.

原文地址:https://www.jb51.cc/csharp/91716.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐