我有一个包含多个UserControl的WinForm项目。此WinForm项目引用了一个程序集(让我们称之为lib.dll
),该程序集是从另一个项目(类库)中创建的,该项目存在于不同的解决方案中。
现在,有几个UserControls
调用lib.dll
来调用app.config
文件中的值。在运行时lib.dll
正常工作并返回必要的数据,但在设计时,我从lib.dll
收到异常,因为app.config
部分是NULL
(例外情况是设计)。
现在我可以浏览每个控件并使用
包装调用lib的所有代码 if(!DesignMode) { //code }
但是这需要很多控制来应用它。我可以在全球范围内做些什么比测试DesignMode属性更优雅吗?
修改
回应下面留下的两条评论:提供的解决方案似乎不起作用。导致我出现问题的程序集与app.config位于同一目录中。一般目录结构如下所示
app.config
提取位于Configurations目录中的其他几个配置文件(appsettings
,cnx
字符串等)。在我的异常情况下,我试图获得的值存在于app.config
引用的其中一个辅助配置文件中。
答案 0 :(得分:0)
这是一个有趣的问题。一个解决方案可能是在lib.dll中创建一个类似这样的静态类:
public static class Config
{
private static readonly _param1;
static Config()
{
_param1 = ConfigurationManager.AppSettings["Param1"] ?? "Your default value";
}
public static string Param1
{
get { return _param1; }
}
}
然后,在您的代码中,编写了ConfigurationManager.AppSettings [“Param1”],您将使用Config.Param1。因此,您不需要测试属性DesignMode。
答案 1 :(得分:0)
有很多方法可以做到这一点,恕我直言。
我想到的一个想法就是对所讨论的用户控件使用基于继承的方法吗?这样,在基类中,您可以将if (DesignMode)
签入,并从那里执行正确的分支。
// if i were to visualizeyour lib.dll data initializer call like this:
class BaseUserControl
{
// i'm guessing that you initialize the data somehow...
void InitializeData()
{
if (!DesignMode)
{
InitializeDataLocal();
}
}
protected virtual InitializeDataLocal()
{
// whatever base behavior you want should go here.
}
}
// in the derived classes, just put the code you currently have for
// fetching the data from lib.dll here...
class UserControl : BaseUserControl
{
protected override InitializeDataLocal()
{
// fetch from lib.dll...
// optionally invoke some base behavior as well,
// if you need to...
base.InitializeDataLocal();
}
}