假设我有一个具有此属性的A类的projoct A:
public bool IsConnected { get { return m_isConnected; } private set { m_isConnected = value; } }
在同一个解决方案中,我有一个引用项目A的项目B,并且有一个名为 Login 的用户控件。此控件具有以下属性:
private A m_A = null;
并在登录的构造函数中,我执行此调用:
if(m_A!= null&& m_A.IsConnected){ ......}
在同一个项目中,主窗体上有一个用窗体设计器添加的用户控件A.程序运行正常,正确读取此属性。
但是,在Designer中打开主窗体时,我得到了这个功能: MissingMethodException:'Boolean A.get_IsConnected()'
评论m_A.IsConnected让我使用设计师,但这变得非常烦人。有时似乎它随机起作用。
有什么想法吗?
答案 0 :(得分:0)
您可以使用:
而不是评论它if (this.DesignMode)
{
return;
}
或
if (!this.DesignMode)
{
if (m_A != null && m_A.IsConnected) { ... }
}
编辑:
我记得曾经遇到过单身类问题。问题是单例总是被初始化,尽管从未调用过构造函数。如果我正确理解您的问题,您的问题也是如此。您的成员m_A永远不会为NULL,尽管它应该是。
我用以下方法处理了我的问题:
在Visual Studio中,转到“工具\选项... \调试\常规”并禁用“启用属性评估和其他隐式函数调用”并启用“跳过属性和运算符(仅限托管)”。
也许这有帮助。
答案 1 :(得分:0)
我过去曾被告知这个.DesignMode并不总是完全可靠。您可以使用的另一个选项是预处理程序指令:
#if DESIGN
return;
#else
if (m_A != null && m_A.IsConnected) { /* etc. */ }
#endif
然后添加一个名为DESIGN的条件编译符号,你应该是金色的。
答案 2 :(得分:0)
正如Ari Roth所说,DesignMode无法正常工作。为了弥补这一点,我使用了这种扩展方法:
public static bool IsDesignTime(this Control control)
{
if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
{
return true;
}
if (control.Site != null && control.Site.DesignMode)
{
return true;
}
var parent = control.Parent;
while (parent != null)
{
if (parent.Site != null && parent.Site.DesignMode)
{
return true;
}
parent = parent.Parent;
}
return false;
}
以与Simon Linder描述的方式相同的方式使用它。
答案 3 :(得分:0)
看起来设计师正在使用旧版本的控件DLL,它没有IsConnected属性。
MissingMethodException异常与m_A的值无关。 JIT编译器抱怨该属性丢失。如果在方法中将调用包装到m_A.IsConnected,则它可以工作,因为不调用此方法(因为m_A确实为null),因此不会被jitted,因此不需要IsConnected属性。
当你将控件放在VS中的一个表单中时,设计器在表单中创建一个控件的“真实”实例,它调用构造函数,这会导致JIT编译问题。