4

リフレクションを使用してメソッドの属性を確認しています。

リフレクションを使用してさらに深く掘り下げ、クラスの継承を確認します。

クラスが自分のものではなく、.NET Framework の場合は停止する必要があります。

どうすればこれを確認できますか?

どうも

4

4 に答える 4

2

次の場所に移動する必要があると思います。

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

取得した属性の値を調べる

于 2013-05-04T14:12:55.133 に答える
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

于 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 の型を正確に確認できます。

    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 に答える