リフレクションを使用してメソッドの属性を確認しています。
リフレクションを使用してさらに深く掘り下げ、クラスの継承を確認します。
クラスが自分のものではなく、.NET Framework の場合は停止する必要があります。
どうすればこれを確認できますか?
どうも
リフレクションを使用してメソッドの属性を確認しています。
リフレクションを使用してさらに深く掘り下げ、クラスの継承を確認します。
クラスが自分のものではなく、.NET Framework の場合は停止する必要があります。
どうすればこれを確認できますか?
どうも
次の場所に移動する必要があると思います。
exception.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
取得した属性の値を調べる
アセンブリが 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
これは、可能な解決策を提供するための小さな例です。
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 で停止します。このプログラムは、別のアセンブリで定義されたカスタム型のケースには対応していません。これにより、先に進む方法についてのアイデアが得られることを願っています。
型コンバーターを定義していない場合は、簡単に確認できます。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;
}