4

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

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

当类是 .NET Framework 时,我需要停下来,而不是我自己的。

我怎样才能检查这个?

谢谢

4

4 回答 4

2

我想你应该搬到:

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

并调查检索到的属性的值

于 2013-05-04T14:12:55.133 回答
2

如果你想检查一个程序集是由微软发布的,你可以这样做:

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 的验证码签名,就像这里所做的一样:Get timestamp from Authenticode Signed files in .NET

于 2013-05-04T14:27:26.203 回答
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 处停止。该程序不会涵盖在另一个程序集中定义的自定义类型的情况。希望这能让您了解如何继续。

于 2013-05-04T13:58:56.503 回答
0

如果您不定义类型转换器,那么您可以轻松检查。Microsoft 定义几乎每个类都定义一个类型转换器(StringConverter、DoubleConverter、GuidConverter 等),因此您必须检查其类型转换器是否为默认值。所有的类型转换器都是由 TypeConverter 继承的,所以你可以准确地查看转换器 TypeConverter 的 Is 类型。

    public static bool IsUserDefined(Type type)
    {
        var td = TypeDescriptor.GetConverter(type);
        if (td.GetType() == typeof(TypeConverter))
            return true;
        return false;
    }
于 2015-12-03T11:47:51.220 回答