用C#反射修改类中的私有常量字段

时间:2011-01-01 21:33:49

标签: c# .net reflection

我有以下课程:

class RuleParser
{
   private const String FILE = "./rules/DetectionStrategies.xml";
   .
   .
   .
}

现在在我的测试项目中,我想将FILE常量设置为另一个值。如何使用Reflection实现这一目标?

4 个答案:

答案 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

一些简单的例子是:

  1. 将值移至App.Config,以便测试可以有不同的值。
  2. 通过在构造函数中提供RuleParser类来提取文件路径。通过指定路径本身,或者通过提供一些在运行时提供值的接口(例如IFileParserConfig)。