【问题标题】:Get property and class name in DisplayNameAttribute derived class获取 DisplayNameAttribute 派生类中的属性和类名
【发布时间】: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)?
    }
}

是否也可以获取类名?

【问题讨论】:

  • @JoeFarrell:谢谢你。我刚刚编辑了我的问题,还有 gettng 类名的解决方案吗?
  • 虽然我不理解你的目标,但恕我直言,这有点设计味道。属性不应该知道它们被应用(构造)到哪些成员。您可能应该将此逻辑放在您使用自定义属性的地方,例如,如果属性中的字符串为空或为空,则回退到属性名称。
  • @ZoltánTamási:我需要这个来进行本地化。在本地化文件中,我将使用 resourceID 作为 className.propertyName。我只是想装饰我的属性只是 [DisplayNameEx] 属性,而不是 [DisplayNameEx("className.propertyName")]。

标签: c# .net .net-4.5


【解决方案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,因为它支持本地化并且功能更强大。

    我个人不会推荐你的想法,主要有两个原因。

    1. 潜在的重构问题。如果有人重命名您的属性,他不知道他也应该用相同的名称重命名资源。同样代表类名。几个月后,你有时也会忘记它。

    2. 代码并不简单。其他开发者无法轻易理解您的属性在做什么,甚至乍一看很难看出它与本地化有关。

    我认为最好的办法就是把这些字符串放在那里。

    【讨论】:

      猜你喜欢
      • 2022-06-10
      • 2017-11-05
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-03
      • 2012-09-01
      相关资源
      最近更新 更多