2017-04-25 66 views
1

在我的应用程序有一个自定义属性卡耶斯ResourceTargetAttribute它看起来像:获取PROPERTYNAME其中属性是

[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; } 

class其中FileNotFoundErrorText的构造-Property被定义为解析这个属性。这工作正常。

现在我正在考虑将属性扩展为具有无参数的构造函数,并且如果这被称为Property的名称,该属性将自动用于ResourceKey。 所以我介绍了一个新的构造函数,只是看起来像:

public ResourceTargetAttribute() 
{ 

} 

然后使用应该是这样的:

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

在这里,我想有FileNotFoundErrorText-属性的名称被自动传递给ResourceTarget-Attribute。

有没有可能做到这一点?

回答

1

CallerMemberNameAttribute可以帮助你:

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

用法:

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

如果你得到的属性,则

attr.ResourceKey 

属性应包含FileNotFoundErrorText的价值。

否则,我只是想通过名称作为字符串的方式,因为属性是元数据应用于类型的成员,类型本身,方法参数或程序集,因此您必须让原始成员本身访问其元数据。

+0

属性是类型系统的一部分,因此参数在编译时需要为常量值。可选声明将导致始终为空,因为没有任何内容会注入来电者姓名... –

+0

大约5分钟前,我也发现了此解决方案:)谢谢 – Tomtom

0

最简单的方法是利用nameof运营商:

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

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

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

+0

'FileNotFoundErrorText'属性只是一个例子。我想要一个通用的方式在许多属性上重用它 – Tomtom

+0

是的,这得到了我答案的第二部分的支持。如果您提供了“查找”属性的代码,我可以进一步解释该解决方案。 –