Enum上的参数化描述属性

时间:2018-04-17 14:53:53

标签: c# asp.net string oop enums

我有一个提供商业子代码的枚举。不幸的是,我意识到枚举值的描述​​因用户而异。

这是我想在一个完美的世界中实现的目标,但我知道在运行时无法改变属性的值。

public enum BusinessSubcodesEnum
{
    [Representation(@"Cannot charge customers basket. No default currency set for user: {0}.")]
    DefaultCurrencyNotSet = 18        
}

值得注意的是,有像上面这样的子代码的hundreads所以我真的想避免使用BusinessCode和Description字段的类的hundreads。我怎么能克服这个?抽象/通用类?

2 个答案:

答案 0 :(得分:1)

据我所知,您只能使用编译时常量作为任何属性属性的值。

虽然我在官方文档中找不到,但我确实找到了支持此声明的证据 - 来自Microsoft Docs中的Applying Attributes页面:

  

编译代码时,该属性会发送到元数据中

来自Extending Metadata Using Attributes页面:

  

属性允许您将额外的描述性信息放入可以使用运行时反射服务提取的元数据中。当您声明从System.Attribute派生的特殊类的实例时,编译器会创建属性。

但是,您可以使用像Dictionary<BusinessSubcodesEnum, string>这样简单的内容来存储enum成员说明,当然,这对运行时更改没有任何问题。

答案 1 :(得分:1)

听起来这是使用“强类型枚举”的好时机。这种结构的行为类似于常规枚举,但可以减轻枚举所缺乏的行为。

创建一个类BusinessSubCode并在该类相同类型中创建静态属性。现在您可以使用相同的行为,即BusinessSubCode.DefaultCurrencyNotSet,并访问这些静态属性的属性。

public class BusinessSubCode 
{
    public static BusinessSubCode DefaultCurrencyNotSet { Representation = "Enter text here", Value = 18 };
    public static BusinessSubCode DefaultCurrencySet { Representation = "Enter other text here", Value = 28 };

    public string Representation {get;}
    public int Value {get;}
}

您还可以覆盖ToString()方法并使用其他技巧使其行为类似于枚举,但具有扩展功能。查看此great blog post以获取更多优秀的源代码。

您可以像平常一样向课堂添加您喜欢的任何属性和方法。