返回类成员的所有属性的函数

时间:2014-02-06 21:39:34

标签: c#

假设我有课

class A 
{
    [Attribute1]
    [AttributeN]
    bool Prop {get;set;}

}

void Main ()
{
    A a;
    var attrs = GetAttributes(a.Prop);
}

哪个是实现GetAttributes函数的最佳方法?

非常感谢

编辑: 让我更具体一点,我知道需要使用reflaction 我不想使用字符串作为方法名称 2.它不应该依赖于类型,应该是通用函数

function GetAttr<...>(...)
{
    ....
    typeof(<get from param>).GetMethod(<figure out from parameters>).GetAttributes()
}

// Ideally I want to call GetAttr like below 
A1 a1
GetAttr(a1.Prop1)

B2 b2
GetAttr(b2.Prop2)

3 个答案:

答案 0 :(得分:5)

您可以使用GetCustomAttributes方法:

var attrs = typeof(A).GetProperty("Prop",BindingFlags.Instance | BindingFlags.NonPublic)
                     .GetCustomAttributes(false);

如果您想使用自定义方法,那么您可以定义一个简单的方法:

public static object[] GetAttributes(Type type, string propertyName)
{
     var prop = type.GetProperty(propertyName);
     if (prop != null)
     {
         return prop.GetCustomAttributes(false);
     }
     else
     {
         return null;
     }
}

BindingFlags

的重载版本
public static object[] GetAttributes(Type type, string propertyName,BindingFlags flags)
{
     var prop = type.GetProperty(propertyName,flags);
     if (prop != null)
     {
         return prop.GetCustomAttributes(false);
     }
     else
     {
         return null;
     }
}

然后你可以这样称呼它:

var attrs = GetAttributes(typeof(A), "Prop");

或者:

var attrs = GetAttributes(typeof(A), "Prop",BindingFlags.Instance | BindingFlags.NonPublic);

答案 1 :(得分:3)

您可以创建将接受属性选择器表达式的扩展方法(因此您将避免将属性名称硬编码为字符串):

public static IEnumerable<Attribute> GetPropertyAttributes<T, TProp>(
    this T obj, Expression<Func<T, TProp>> propertySelector)
{
    Expression body = propertySelector;
    if (body is LambdaExpression)
        body = ((LambdaExpression)body).Body;

    if (body.NodeType != ExpressionType.MemberAccess)
        throw new InvalidOperationException();

    var pi = (PropertyInfo)((MemberExpression)body).Member;
    return pi.GetCustomAttributes();
}

用法:

A a = new A();
var attributes = a.GetPropertyAttributes(x => x.Prop);

答案 2 :(得分:0)

您应该只使用Reflection来实现您的目标。在这种情况下,您需要利用两种反射方法,即GetPropertyGetCustomAttributes

class A 
{
    [Attribute1]
    [AttributeN]
    bool Prop {get;set;}

}

void Main ()
{
    A a;
    var attrs = typeof(A).GetProperty("Prop").GetCustomAttributes();
}