动态注释/属性值

本文关键字:属性 注释 动态 | 更新日期: 2023-09-27 17:56:48

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

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

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

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

没有人对这个问题有很好的解决方案?

动态注释/属性值

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

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

注意:这与某些 DP 完全相反,因此我们可以安全地将其称为反模式,但这里没有其他选择。

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