在继承自DisplayNameAttribute的类中获取属性和类名

4

我有一个类,其中一些属性带有DisplayNameEx属性,该属性是从DisplayNameAttribute派生而来的:

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)?
    }
}

是否可以获取类名?


可能是重复的问题:如何获取设置了我们属性的名称? - Joe Farrell
@JoeFarrell:谢谢你的回答。我刚刚编辑了我的问题,有没有获取类名的解决方案? - Pyko
1
虽然我理解你的目标,但在我看来,这有相当多的设计上的不妥之处。属性不应该知道它们被应用(构造)到哪些成员上。你应该把这个逻辑放到消费自定义属性的地方,比如说,如果字符串在属性中为空或者为null,就回退到属性名字上。 - Zoltán Tamási
@ZoltánTamási:我需要这个来进行本地化。在本地化文件中,我将使用resourceID作为className.propertyName。我只想用[DisplayNameEx]属性装饰我的属性,而不是[DisplayNameEx("className.propertyName")]。 - Pyko
2个回答

0

这是不可能的。在您的情况下,最好的方法是在属性构造函数中使用类名作为参数:

public class DisplayNameExAttribute : DisplayNameAttribute
{
    public DisplayNameExAttribute(string className = null)
    {

    }
}

然后像这样使用它:

public class Settings
{
    [DisplayNameEx("Settings")]
    public UserData User { get; set; }
}

0

我之前使用过类似的技术,即.NET 4的本地化DisplayAttribute。从.NET 4开始,我使用DisplayAttribute,因为它支持本地化并且更加强大。

个人而言,我不建议您的想法,主要有两个原因:

  1. 潜在的重构问题。如果有人重命名了您的属性,他不知道还应该将相同名称的资源进行重命名。类名也是如此。几个月后,甚至您自己有时也会忘记。

  2. 代码不够直观。其他开发人员可能无法轻松理解您的属性,甚至很难一眼看出它与本地化相关。

我认为最好的方法就是直接将这些字符串放在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接