从其属性访问属性

时间:2014-08-18 11:03:07

标签: c# generics attributes

是否可以从已在该属性上实现的属性访问属性类型?

public class FooAttribute : Attribute
{
    public string GetPropertyName()
    {
        // return ??
    }
}

public class Bar
{
    [FooAttribute]
    public int Baz { get; set; }
}

我希望GetPropertyName()返回" Baz"。

2 个答案:

答案 0 :(得分:1)

你所要求的是不可能的。因为属性和属性没有“一对一”关系。您可以将FooAttribute应用于任意数量的属性,在这种情况下,您需要从GetPropertyName方法返回哪个属性?

正如我在评论中所说,你可以循环遍历所有类型及其属性,看看哪些属性都有FooAttribute,但显然这不是你想要的。

答案 1 :(得分:1)

Sriram Sakthivel是正确的,这是不可能的,但是如果你使用.net 4.5,你可以使用CallerMemberNameAttribute创建一个变通方法,将调用者传递给属性的构造函数,存储它然后从你的GetPropertyName方法:

public class FooAttribute : Attribute
{
    public string PropertyName { get; set; }
    public FooAttribute([CallerMemberName] string propertyName = null)
    {
        PropertyName = propertyName;
    }

    public string GetPropertyName()
    {
        return PropertyName;   
    }
}

这会将调用者(属性)传递给属性的构造函数。

MSDN上提供了有关CallerMemberNameAttribute的更多详情。