我有以下情况。我的应用程序中有一些非常常见的类,它包含一个名为“BinDirectory”的静态只读字段,它保存bin目录的路径。此类中的其他字段(也是静态只读)也使用此值作为其值的基础。在当前版本上,BinDirectory被初始化为保存代码运行的目录(即Assembly.GetExecutingAssembly()。CodeBase)。我想扩展此类以初始化BinDirectory,以便在从我的应用程序安装程序运行时从安装程序上下文中保存“TargetDir”。我可以将BinDirectory改为静态但我不想,因为它会让我对我的应用程序中常见的类进行大量更改。有人可以为这个问题提出一个优雅的解决方案吗?
答案 0 :(得分: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
作为它的有效值。
答案 1 :(得分:3)
这就是AppConfigs的用途。在AppSettings部分,添加名为BinDirectory
的新密钥。您可以将您的课程重写为:
public static string BinDirectory
{
get
{
return ConfigurationManager.AppSettings["BinDirectory"];
}
}
最后,作为安装过程的最后一步,您可以将BinDirectory更改为指向所需的任何目录。所以现在这个值完全由安装程序上下文决定。
答案 2 :(得分:0)
听起来你不愿意将静态只读字段更改为静态,因为它会强制您更改类中所有其他静态只读字段的初始化。
如果这是正确的,不幸的是,你可以做很多事情,但要花时间做出改变。通过允许在运行时设置BinDirectory字段,您将从根本上改变字段的初始化顺序。您的代码需要适应。
我认为最简单的方法是转换为使用静态只读属性,这些属性可以动态计算值。
例如:
public class Values {
public static string BinDir;
public static string OtherDir {
get { return Path.Combine(BinDir,@"Some\Other\Path"); }
}
}