在不创建实例的情况下获取方法的属性

时间:2018-06-02 15:47:31

标签: c#

我有以下课程:

public class Person
{
   [SomeCustomAttribute]
   public void blahblahblah()
   {}
}

是否可以通过反射提取方法的属性,而无需创建实例?我知道实例属性不可能,实例方法怎么样?如果方法是静态的,它会起作用吗?

2 个答案:

答案 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);
    }
}

反思&#34;分析&#34;类型只需要Type对象,而不是您要分析的clas实例。和属性&#34;生活&#34;在Type中,而不是在对象的每个实例中。如果在编译时Type知道typeof(Person),那么这里没有问题。如果它是通用T的{​​{1}},则相同。第三种常见方法是,如果您有MyMethod<T>()实例,则myObj将返回实例的myObj.GetType()。第四种方法使用Type并使用string,但它需要全名,所以它很复杂。

你可以&#34;分析&#34; (枚举)反射字段,属性,方法(它们的描述符,而不是它们的值。要清除的元数据!)...所有都以Type.GetType()对象开头。如果没有对象的实例,你可以做的是获取实例字段/属性的值,设置实例字段/属性的值,调用实例方法(但显然你可以用{{1来完成上述所有操作字段/属性/方法)

相关问题