C#。检查Type是否为.NET Framework,而不是我自己的类型

时间:2013-05-03 09:20:55

标签: .net class reflection types

我使用反射来检查方法的属性。

使用反射和检查类继承来深入和深入。

我需要在类是.NET Framework时停止,而不是我自己的。

我怎么检查这个?

THX

4 个答案:

答案 0 :(得分:2)

我想你应该转到:

exception.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);

并调查检索到的值

的属性

答案 1 :(得分:2)

如果要检查Microsoft发布的程序集,您可以执行以下操作:

public static bool IsMicrosoftType(Type type)
{
    if (type == null)
        throw new ArgumentNullException("type");

    if (type.Assembly == null)
        return false;

    object[] atts = type.Assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), true);
    if ((atts == null) || (atts.Length == 0))
        return false;

    AssemblyCompanyAttribute aca = (AssemblyCompanyAttribute)atts[0];
    return aca.Company != null && aca.Company.IndexOf("Microsoft Corporation", StringComparison.OrdinalIgnoreCase) >= 0;
}

这不是防弹,因为任何人都可以将这样的AssemblyCompany属性添加到自定义程序集,但这是一个开始。为了更安全地确定,您需要从程序集中检查Microsoft的authenticode签名,如此处所做的:Get timestamp from Authenticode Signed files in .NET

答案 2 :(得分:0)

这是一个小例子,只是为了给你一个可能的解决方案:

 private static void Main(string[] args)
    {

        var persian = new Persian();

        var type = persian.GetType();

       var location = type.Assembly.Location;

        do
        {
            if (type == null) break;

            Console.WriteLine(type.ToString());

            type = type.BaseType;

        } while (type != typeof(object) && type.Assembly.Location == location);

        Console.ReadLine();

    }
}

class Animal : Dictionary<string,string>
{

}

class Cat : Animal
{

}

class Persian : Cat
{

}

因为你可以测试自己程序执行将停止在Animal。此程序不会涵盖另一个程序集中定义的自定义类型的情况。希望这可以让你了解如何处理。

答案 3 :(得分:0)

如果您没有定义类型转换器,那么您可以轻松检查。 Microsoft定义的每个类大多定义一个类型转换器(StringConverter,DoubleConverter,GuidConverter等),因此必须检查其类型转换器是否为默认值。所有类型的转换器都由TypeConverter接收,因此您可以准确检查转换器TypeConverter的类型。

    public static bool IsUserDefined(Type type)
    {
        var td = TypeDescriptor.GetConverter(type);
        if (td.GetType() == typeof(TypeConverter))
            return true;
        return false;
    }