获取 DisplayNameAttribute 派生类中的属性和类名
Posted
技术标签:
【中文标题】获取 DisplayNameAttribute 派生类中的属性和类名【英文标题】:Get property and class name in DisplayNameAttribute derived class 【发布时间】:2015-06-25 16:50:04 【问题描述】:我有一个带有 DisplayNameEx 属性的类,该属性派生自 DisplayNameAttibute:
public class Settings
[DisplayNameEx("User")]
public UserData User get; set;
public class DisplayNameExAttribute : DisplayNameAttribute
public DisplayNameExAttribute(string id)
我总是将我的属性的名称作为字符串 id 传递,因此这样编写代码会更容易:
public class Settings
[DisplayNameEx()]
public UserData User get; set;
我可以通过 CallerMemberName 属性获得的属性名称:
public class DisplayNameExAttribute : DisplayNameAttribute
public DisplayNameExAttribute([CallerMemberName] string propertyName = null)
//propertyName I get, what about class name (Settings in my case)?
是否也可以获取类名?
【问题讨论】:
How to get name of property which our attribute is set? 的可能重复项 How do I get the member to which my custom attribute was applied?的可能重复 @JoeFarrell:谢谢你。我刚刚编辑了我的问题,还有 gettng 类名的解决方案吗? 虽然我不理解你的目标,但恕我直言,这有点设计味道。属性不应该知道它们被应用(构造)到哪些成员。您可能应该将此逻辑放在您使用自定义属性的地方,例如,如果属性中的字符串为空或为空,则回退到属性名称。 @ZoltánTamási:我需要这个来进行本地化。在本地化文件中,我将使用 resourceID 作为 className.propertyName。我只是想装饰我的属性只是 [DisplayNameEx] 属性,而不是 [DisplayNameEx("className.propertyName")]。 【参考方案1】:这是不可能的。在您的情况下,最好的方法是在属性的构造函数中使用类名参数:
public class DisplayNameExAttribute : DisplayNameAttribute
public DisplayNameExAttribute(string className = null)
然后像这样使用它:
public class Settings
[DisplayNameEx("Settings")]
public UserData User get; set;
【讨论】:
【参考方案2】:在 .NET 4 的可本地化 DisplayAttribute
之前,我使用了类似的技术。从 .NET 4 开始,我使用 DisplayAttribute
,因为它支持本地化并且功能更强大。
我个人不会推荐你的想法,主要有两个原因。
潜在的重构问题。如果有人重命名您的属性,他不知道他也应该用相同的名称重命名资源。同样代表类名。几个月后,你有时也会忘记它。
代码并不简单。其他开发者无法轻易理解您的属性在做什么,甚至乍一看很难看出它与本地化有关。
我认为最好的办法就是把这些字符串放在那里。
【讨论】:
以上是关于获取 DisplayNameAttribute 派生类中的属性和类名的主要内容,如果未能解决你的问题,请参考以下文章