将非常量表达式设置为DisplayName

本文关键字:DisplayName 设置 表达式 非常 常量 | 更新日期: 2023-09-27 18:28:14

我需要动态地(从数据库)加载属性的DisplayName。例如:

[DisplayName(getDescriptionForLanguage("test"))]
public string test{ get; set; }

但是只能动态加载DisplayName,只允许使用常量。是否有某种方法可以将DisplayName作为方法的结果,而不是从资源文件或常量中获取?

将非常量表达式设置为DisplayName

可以调用一个返回非常量字符串的方法
你必须创建一个新的归因类,例如:

class DisplayNameLanguage : DisplayNameAttribute
{
    private readonly string resourceName;
    public DisplayNameLanguage(string resourceName)
        : base()
    {
        this.resourceName = resourceName;
    }
    public override string DisplayName
    {
        get
        {
            return getDescriptionForLanguage(resourceName);
        }
     }
}

现在您必须创建模型的一个子类。在那里,您可以使用从方法getDescriptionForLanguage:获得描述的新属性

[MetadataType(typeof(TestMD))]
public partial class Test { }
public partial class TestMD
{
    [DisplayNameLanguage("Test")]
    public string Prop1 { get; set; }
}

没有办法改变这种行为。传递给属性的值需要是一个编译时常数,这意味着即使使用静态类的静态属性也不会起到作用。

但是,根据dtb的建议,您可以停止使用DisplayName-属性来获取显示名称,而是在计算DisplayName-属性值的地方构建自己的机制。