我使用反射来检查方法的属性。
使用反射和检查类继承来深入和深入。
我需要在类是.NET Framework时停止,而不是我自己的。
我怎么检查这个?
THX
答案 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;
}