连接常量字符串和枚举

6

我有一个大型的C#类,里面充满了无非是public const string字段。然而,在某些情况下,我正试图将一个字符串和枚举值连接成一个const string字段,就像这样:

public const string GET_VALUES = "SELECT * FROM [tbl] WHERE [id] = " + Enum.Val;

然而,我遇到了这个编译器错误:
'Namespace.SqlStatements.GET_VALUES' must be constant

我知道我可以省略 const 关键字,但我想让这个类中的所有字段保持一致。在 C# 中能否将一个常量字符串和一个枚举拼接起来?


4
您可以使用public readonly...您不能使用const,因为常量字符串必须在编译时就已知。将枚举值与字符串连接需要将该枚举值转换为字符串--这是在运行程序期间而不是在编译期间发生的事情。 - user2819245
@elgonzo 不错的想法,但那不太符合我之前提到的一致性。如果没有其他办法,那么 readonly 就是可行的方式。 - Oliver Spryn
1
我扩展了我的第一个评论。请看那里为什么在这种情况下不能使用 const... - user2819245
顺便提一下,在代码中操作 SQL 语句时要小心,确保自己不会遭受 SQL 注入攻击! - Philip Pittle
@PhilipPittle 我对这些事情非常挑剔。由于枚举是严格由程序员定义的,所以我认为不使用预处理语句也可以接受。 - Oliver Spryn
@SujithKarivelil 我怎么会错过那个?? :) - Oliver Spryn
1个回答

5

来自MSDN:

常量表达式是一种可以在编译时完全计算的表达式。因此,引用类型的常量仅可能是字符串和空引用。

在您的情况下,枚举将需要使用 ToString 转换为字符串,这在编译时不可能完成。建议您像elgonzo提到的那样将其更改为 readonly


然而,我并没有在枚举上调用 ToString() 方法,我正在寻找它的整数值。因此,枚举值无法在编译时解析? - Oliver Spryn
不,这是编译器隐式完成的。 - Chris
好的!对我来说听起来不错。谢谢! - Oliver Spryn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接