C# 动态注释/属性值

C# 动态注释/属性值,c#,validation,annotations,attributes,C#,Validation,Annotations,Attributes,我在c#中使用数据注释时遇到了一个问题。我正在使用自定义必需属性和范围属性,我想将一个对象设置为错误消息 [MyOwnRequired(ErrorCode=GlobalMessages.Message01] public string Description { get; set; } 问题是我确实有一个类,它包含几个对象(GlobalMessages.Message01,每个对象包含一条消息和一个代码),以便在整个应用程序中转换不同的错误消息 正如几篇文章所述,不可能将非常量表达式用作数据注

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

[MyOwnRequired(ErrorCode=GlobalMessages.Message01]
public string Description { get; set; }
问题是我确实有一个类,它包含几个对象(GlobalMessages.Message01,每个对象包含一条消息和一个代码),以便在整个应用程序中转换不同的错误消息

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


有人能很好地解决这个问题吗?

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

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

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


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

感谢您的输入!但仍然存在如何扩展枚举的问题(不使用T4)。你将如何解决这个问题?我还考虑了一些类似javadocs的东西,在这里我可以在注释中引用对象,但是没有发现任何有用的东西,比如为枚举创建一个命名约定,然后在构造函数中使用反射来获得该名称。您还可以根据给定的名称和反射创建不同的错误类实例。实现错误类,并为它们提供约定给定的适当名称。最简单的情况:枚举常量名称与错误类名匹配。