c# - 检测对象的类型是否为 .NET Framework 定义的类型

标签 c# .net reflection

如何通过反射确定对象的类型是由我自己的程序集中的类定义的还是由 .NET Framework 定义的?

我不想在代码中提供我自己的程序集的名称,因为它应该适用于任何程序集和命名空间。

最佳答案

第三方类型从何而来?您可能想要区分声称由 Microsoft 提供的类型和不提供的类型。

using System;
using System.Linq;
using System.Reflection;

class Test
{
    static void Main()
    {
        Console.WriteLine(IsMicrosoftType(typeof(string)));
        Console.WriteLine(IsMicrosoftType(typeof(Test)));
    }

    static bool IsMicrosoftType(Type type)
    {
        object[] attrs = type.Assembly.GetCustomAttributes
            (typeof(AssemblyCompanyAttribute), false);

        return attrs.OfType<AssemblyCompanyAttribute>()
                    .Any(attr => attr.Company == "Microsoft Corporation");
    }
}

当然,任何类型都可以声称给定此方案是 Microsoft 的类型,但如果您实际上只打算在您自己的类型和框架类型上调用它,我怀疑这应该有效很好。

或者,您可以使用程序集的公钥 token 。这可能更难伪造。它依赖于 Microsoft 为其所有程序集使用公共(public)公钥,而他们没有这样做(根据 Mehrdad 在下面的评论)。但是,您可以轻松地针对一组接受的“这来自 Microsoft”公钥 调整此解决方案。也许以某种方式结合这两种方法并报告任何差异以供进一步检查...

static bool IsMicrosoftType(Type type)
{
    AssemblyName name = type.Assembly.GetName();
    byte[] publicKeyToken = name.GetPublicKeyToken();

    return publicKeyToken != null
        && publicKeyToken.Length == 8
        && publicKeyToken[0] == 0xb7
        && publicKeyToken[1] == 0x7a
        && publicKeyToken[2] == 0x5c
        && publicKeyToken[3] == 0x56
        && publicKeyToken[4] == 0x19
        && publicKeyToken[5] == 0x34
        && publicKeyToken[6] == 0xe0
        && publicKeyToken[7] == 0x89;
}

关于c# - 检测对象的类型是否为 .NET Framework 定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/962639/

相关文章:

c# - 使用 C# 为数据表中的特定列赋值

c# - 在 C# 中进行线程工作的最佳方法是什么?

c# - 如何通过反射调用带有枚举(enum)参数的方法?

c# - 实例化所有实现通用接口(interface)实例的类

c# - 在 C# 中通过 System.DirectoryServices 查询自定义 LDAP 属性?

c# - 使用 Activator 创建实例

c# - WinRT 中的透明组合框

c# - 如何创建同时面向 .NET 2.0 和 .NET Standard 的库?

c# - 如何从 Win8 Javascript metro 应用程序引用 C# 类库?

c# - Selenium 与 UWP 应用程序?