获取 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 派生类中的属性和类名的主要内容,如果未能解决你的问题,请参考以下文章

树莓派python 怎么获取 ip 地址

树莓派python获取自身IP

树莓派IP获取踩坑笔记

使用python获取树莓派本地IP地址的位置

markdown 树莓派获取系统实时信息(温度,主频)

使用树莓派3获取CPU温度