加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:24:37 所属栏目:百科 来源:网络整理
导读:我想要明确地确定我的类型是自定义类类型(MyClass)还是由Framework(System.String)提供的类型. 有没有办法反思我可以区分我的类类型与system.string或其他框架提供的类型? 解决方法 安全检查类型是否是程序集的一部分的唯一方法是检查程序集的全名,其名称,
我想要明确地确定我的类型是自定义类类型(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类来检查公钥令牌.这取决于你的需要.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读