获取属性所在的propertyname

时间:2017-04-25 08:31:18

标签: c# attributes

在我的应用程序中,我有一个自定义属性calles ResourceTargetAttribute,如下所示:

[AttributeUsage(AttributeTargets.Property)]
private class ResourceTargetAttribute : Attribute
{
    public ResourceTargetAttribute(string resourceKey)
    {
        ResourceKey = resourceKey;
    }

    public string ResourceKey { get; private set; }
}

用法如下:

[ResourceTarget("FileNotFoundErrorText")
public string FileNotFoundErrorText { get; private set; }

定义FileNotFoundErrorText-Property的class的构造函数解析此属性。这只是工作正常。

现在我正在考虑将属性扩展为具有无参数构造函数,如果调用此属性,则属性所在的属性名称将自动用于ResourceKey。 因此,我引入了一个新的构造函数,它看起来像:

public ResourceTargetAttribute()
{

}

然后用法应该是这样的:

[ResourceTarget()]
public string FileNotFoundErrorText { get; private set; }

在这里,我希望将FileNotFoundErrorText-Property的名称自动传递给ResourceTarget-Attribute。

有可能这样做吗?

2 个答案:

答案 0 :(得分:1)

CallerMemberNameAttribute可能会对您有所帮助:

public ResourceTargetAttribute([CallerMemberName] string propertyName = null)
{
  ResourceKey = propertyName;
}

用法:

[ResourceTarget]
public string FileNotFoundErrorText { get; private set; }

如果你得到属性,

attr.ResourceKey

属性应包含 FileNotFoundErrorText 作为值。

否则我只是将名称作为字符串传递,因为属性是应用于类型成员的元数据,类型本身,方法参数或程序集,因此您必须拥有原始成员本身才能访问其元数据。

答案 1 :(得分:0)

最简单的方法是使用nameof-operator:

[ResourceTarget(nameof(FileNotFoundErrorText)]
public string FileNotFoundErrorText { get; private set; }

另一种方法是修改实际检查/搜索这些标记属性的代码。使用反射来获取应用该属性的实际Property-Name。

也许如果你提供上面提到的“构造函数代码”,我可以进一步提供帮助。