gpt4 book ai didi

c# - 如何确定 System.Type 是自定义类型还是框架类型?

转载 作者:可可西里 更新时间:2023-11-01 08:41:01 26 4
gpt4 key购买 nike

我想清楚地确定我拥有的类型是自定义类类型 (MyClass) 还是框架提供的类型 (System.String)。

有什么方法可以将我的类类型与 system.string 或其他框架提供的类型区分开来吗?

最佳答案

安全检查类型是否属于程序集的唯一方法是检查程序集的完全限定名称,其中包含其名称、版本、区域性和公钥(如果已签名)。所有 .Net 基类库 (BCL) 均由 Microsoft 使用其私钥签名。这使得其他任何人几乎不可能创建与基类库具有相同完全限定名称的程序集。

//add more .Net BCL names as necessary
var systemNames = new HashSet<string>
{
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Core, Version=4.0.0.0, Culture=neutral, 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, Version=4.0.0.0, Culture=neutral, " +
"PublicKeyToken=b77a5c561934e089"),
new AssemblyName ("System.Core, Version=4.0.0.0, Culture=neutral, "+
"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 都使用相同的 key 签名,但不是全部。您可以使用 AssemblyName 类来检查公钥 token 。这取决于您的需求。

关于c# - 如何确定 System.Type 是自定义类型还是框架类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3174921/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com