我使用反射来检查方法的属性。
越来越深入地使用反射和检查类继承。
当类是 .NET Framework 时,我需要停下来,而不是我自己的。
我怎样才能检查这个?
谢谢
我使用反射来检查方法的属性。
越来越深入地使用反射和检查类继承。
当类是 .NET Framework 时,我需要停下来,而不是我自己的。
我怎样才能检查这个?
谢谢
我想你应该搬到:
exception.GetType().Assembly.GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);
并调查检索到的属性的值
如果你想检查一个程序集是由微软发布的,你可以这样做:
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
这是一个小例子,只是为了给你一个可能的解决方案:
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 的 Is 类型。
public static bool IsUserDefined(Type type)
{
var td = TypeDescriptor.GetConverter(type);
if (td.GetType() == typeof(TypeConverter))
return true;
return false;
}