2010-01-26 78 views
2

我有以下情况。在我的应用程序中有一些非常普通的类,它包含一个名为“BinDirectory”的静态只读字段,该字段保存bin目录的路径。此类中的其他字段也是静态只读的,它使用此值作为其值的基础。在当前版本中,BinDirectory被初始化为保存代码运行的目录(即Assembly.GetExecutingAssembly()。CodeBase)。我想扩展这个类来初始化BinDirectory,以便在从我的应用程序安装程序运行时从安装程序上下文中保存“TargetDir”。我可以将BinDirectory改为简单的静态,但我不想,因为它会让我对我的应用程序中常见的类进行很多更改。有人可以提出一个优雅的解决这个问题的方法吗?关于C#静态只读成员

回答

3

这是AppConfigs是。在您的AppSettings部分中,添加一个名为BinDirectory的新密钥。你可以重新写你的类如:

public static string BinDirectory 
{ 
    get 
    { 
     return ConfigurationManager.AppSettings["BinDirectory"]; 
    } 
} 

最后,在安装过程中的最后一个步骤,您可以更改bin目录指向任何你想要的目录。所以现在这个值完全由安装程序上下文决定。

+0

我想你错过了一些括号'()'或'get'块 – Codesleuth 2010-01-26 14:45:33

+0

但是我可以在运行时更改AppSetting吗?如果是,那么这是我的解决方案。 – Ikaso 2010-01-26 14:49:20

+0

这里最好的答案是,你可以在运行时改变appsettings。 – JonH 2010-01-26 14:53:25

5

使其与刚刚“搞定”访问属性:

public static string BinDirectory 
{ 
    get { return _initialisedBinDirectory; } 
} 

然后在你的静态构造函数的代码,初始化私有变量,因为你需要。

编辑

延迟加载(如根据注释):

public static string BinDirectory 
{ 
    get 
    { 
     if (_initialisedBinDirectory == null) 
      // load the variable when needed 
     else 
      return _initialisedBinDirectory; 
    } 
} 

这样,你只加载当你需要它的变量,它的重复使用,只要你再次调用它。希望你不要将null作为一个有效的值。

+0

这是行不通的,因为静态构造函数将在有人首先使用我的类时运行,而这在我调用BinDirectory propery之前可能会发生。 – Ikaso 2010-01-26 14:45:21

+0

我想过代码生成解决方案,或者可能是另一种优雅的方式。 – Ikaso 2010-01-26 14:48:07

+0

我不明白你对这种方法的问题的评论。 – 2010-01-26 14:51:59

0

这听起来像你不愿意将静态只读字段更改为简单静态,因为这会迫使你更改类中所有其他静态只读字段的初始化。

如果这是正确的,不幸的是没有很多你可以做,但花时间做出改变。通过允许在运行时设置BinDirectory字段,您将从根本上改变字段的初始化顺序。你的代码需要适应。

我认为最简单的方法是转换为使用静态只读属性,它可以动态计算值。

例如:

public class Values { 
    public static string BinDir; 
    public static string OtherDir { 
    get { return Path.Combine(BinDir,@"Some\Other\Path"); } 
    } 
} 
+0

您可能需要将Path.Combine的结果“缓存”到字段中。将BinDir也更改为一个属性,并给它一个私有集合操作。 – Zyphrax 2010-01-26 14:42:28