我有以下课程:
public class Person
{
[SomeCustomAttribute]
public void blahblahblah()
{}
}
是否可以通过反射提取方法的属性,而无需创建实例?我知道实例属性不可能,实例方法怎么样?如果方法是静态的,它会起作用吗?
答案 0 :(得分:2)
你使类静态(实际上,静态类在幕后有一个实例)。
在静态类(或任何外部类)中,您可以根据需要执行任何操作而无需实例化对象(包括获取属性)。
答案 1 :(得分:0)
鉴于
public class Person
{
[Obsolete("Obsolete field")]
public int Field { get; set; }
[Obsolete("Obsolete property")]
public int Property { get; set; }
[Obsolete("Obsolete method")]
public void blahblahblah()
{ }
}
然后
Type type = typeof(Person);
foreach (var field in type.GetFields(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
{
foreach (var attr in field.GetCustomAttributes(false))
{
Console.WriteLine("Field {0}: attribute {1}", field, attr);
}
}
foreach (var property in type.GetProperties(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
{
foreach (var attr in property.GetCustomAttributes(false))
{
Console.WriteLine("Property {0}: attribute {1}", property, attr);
}
}
foreach (var method in type.GetMethods(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
{
foreach (var attr in method.GetCustomAttributes(false))
{
Console.WriteLine("Method {0}: attribute {1}", method, attr);
}
}
反思"分析"类型只需要Type
对象,而不是您要分析的clas实例。和属性"生活"在Type
中,而不是在对象的每个实例中。如果在编译时Type
知道typeof(Person)
,那么这里没有问题。如果它是通用T
的{{1}},则相同。第三种常见方法是,如果您有MyMethod<T>()
实例,则myObj
将返回实例的myObj.GetType()
。第四种方法使用Type
并使用string
,但它需要全名,所以它很复杂。
你可以&#34;分析&#34; (枚举)反射字段,属性,方法(它们的描述符,而不是它们的值。要清除的元数据!)...所有都以Type.GetType()
对象开头。如果没有对象的实例,你可以做的是获取实例字段/属性的值,设置实例字段/属性的值,调用实例方法(但显然你可以用{{1来完成上述所有操作字段/属性/方法)