在我的应用程序中,我有一个自定义属性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。
有可能这样做吗?
答案 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。
也许如果你提供上面提到的“构造函数代码”,我可以进一步提供帮助。