我有以下课程:
class RuleParser
{
private const String FILE = "./rules/DetectionStrategies.xml";
.
.
.
}
现在在我的测试项目中,我想将FILE常量设置为另一个值。如何使用Reflection实现这一目标?
答案 0 :(得分:8)
你陷入了陷阱......
const != readonly
如果它是只读的,你可以这样做,但const
表示编译时常量,然后编译器嵌入到生成的程序中。因此,你所做的事情几乎不会影响任何程序,你的或其他程序。
答案 1 :(得分:3)
将此添加到您的配置文件中:
<appSettings>
<add key="DetectionStrategies" value="./rules/DetectionStrategies.xml" />
</appSettings>
但是我会将它作为私人制定者的财产而不是这样:
class RuleParser
{
private string _file = string.Empty;
private string File
{
get
{
if(string.IsNullOrEmpty(_file))
_file = ConfigurationManager.AppSettings["DetectionStrategies"];
return _file;
}
private set;
}
}
您需要记住包含System.Configuration
。
编辑:因为当你为const
分配值时,它必须是一个编译时常量我删除了它并且只保留了“属性”与私有集解决方案。< / p>
编辑2:这一点的重要部分是你应该只使用const
作为真常量,可配置的值应该是可配置的,而配置文件的好地方就是配置文件。虽然,您不必使用配置文件,但您也可以编写自己的配置类,而不是编写数据库,或者使用配置文件作为回退编写数据库。我可能认为你想要使用static
变量而不是const
,但这取决于你如何使用变量以及在什么情况下。
答案 2 :(得分:0)
Geez老兄,你知道什么是常数吗?你无法改变它。我认为编译器甚至不编译对常量的引用,它们只是编译实际值,因此他们甚至不会注意到值是否实际发生了变化。
答案 3 :(得分:0)
我建议您考虑进行一些设计更改以提高代码的可测试性,而不是尝试在运行时(或const
或其他)中更改readonly
。
一些简单的例子是:
App.Config
,以便测试可以有不同的值。RuleParser
类来提取文件路径。通过指定路径本身,或者通过提供一些在运行时提供值的接口(例如IFileParserConfig
)。