动态 annotation/attribute 值

Dynamic annotation/attribute values

我 运行 在 C# 中使用数据注释遇到了问题。我正在使用自定义必需属性和范围属性,我想将一个对象设置为错误消息。

[MyOwnRequired(ErrorCode=GlobalMessages.Message01]
public string Description { get; set; }

问题是我确实有一个 class 包含多个对象(GlobalMessages.Message01,每个对象包含一条消息和一个代码)以便在整个应用程序中转换不同的错误消息。

正如几篇文章所述,不可能将非常量表达式用作数据 annotations/attributes。我不能使用枚举来解决这个问题,因为我需要在不同的项目中扩展错误消息,而枚举(继承)是不允许的。我也不想将 ErrorCode 用作字符串,因为我想在每个属性(悬停)上查看消息。

有没有人有解决这个问题的好方法?

都是真的。你不能。尽管你写了你不能使用枚举,这实际上可以作为一个解决方案:

将枚举参数传递给您的属性 并且 在属性构造函数的 logic/algorithm 中使用此参数来实现您的扩展逻辑。

注意:这与某些 DP 完全相反,因此我们可以放心地将其称为反模式,但这里别无选择。

如果这是您项目中重要且冗长的部分,那么在此处使用反模式可能会降低生产力。这种情况下,您还可以使用代码生成来生成属性的一部分,并根据项目中的一些更改自动在构造函数中生成巨大的开关(及其逻辑)。这消除了反模式的大部分 实际 缺点。 (好吧,它仍然很难看)这个案例的推荐工具是 T4,它得到了广泛的支持。