4

假设我有一个项目 A,其类 A 具有此属性:

    public bool IsConnected
    {
        get { return m_isConnected; }
        private set { m_isConnected = value; }
    }

在同一个解决方案中,我有一个引用项目 A 的项目 B 并有一个名为Login的用户控件。此控件具有以下属性:

    private A m_A = null;

Login的构造函数中,我执行以下调用:

if (m_A != null && m_A.IsConnected) { ... }

在同一个项目中,主窗体上有一个用户控件 A,该控件是随窗体设计器添加的。程序运行良好,并且该属性被正确读取。

但是,在设计器中打开主窗体时,我得到了这个执行: MissingMethodException: 'Boolean A.get_IsConnected()'

注释掉 m_A.IsConnected 让我使用设计器,但这很烦人。有时它似乎随机地起作用。

有任何想法吗?

4

4 回答 4

0

而不是注释掉它,你可以使用:

if (this.DesignMode)
{
    return;
}

或者

if (!this.DesignMode)
{
    if (m_A != null && m_A.IsConnected) { ... }
}

编辑:我记得有一次单例类有问题。问题是尽管从未调用过构造函数,但单例总是被初始化。如果我正确理解您的问题,您的问题也是如此。您的成员 m_A 永远不会为 NULL,尽管它应该是。
我通过以下方式解决了我的问题:
在 Visual Studio 中,转到“Tools\Options...\Debugging\General”并禁用“启用属性评估和其他隐式函数调用”并启用“跳过属性和运算符(仅限托管)” .
也许这有帮助。

于 2010-02-08T14:38:15.703 回答
0

过去有人告诉我 this.DesignMode 并不总是完全可靠的。您可以使用的另一个选项是预处理器指令:

#if DESIGN
return;
#else
if (m_A != null && m_A.IsConnected) { /* etc. */ }
#endif

然后添加一个名为 DESIGN 的条件编译符号,你应该是金色的。

于 2010-02-16T01:14:33.450 回答
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 描述的相同方式使用它。

于 2010-02-16T23:49:32.783 回答
0

看起来设计器使用的是旧版本的控件 DLL,它没有 IsConnected 属性。

MissingMethodException 异常与 m_A 的值无关。是 JIT 编译器抱怨缺少该属性。如果将 m_A.IsConnected 的调用包装在一个方法中,它会起作用,因为该方法没有被调用(因为 m_A 确实为 null),因此没有被 jitted,因此不需要 IsConnected 属性。

当您将控件放入VS中的表单时,设计器会在表单中创建您的控件的“真实”实例,该实例调用构造函数,从而导致JIT编译问题。

于 2010-02-23T14:43:24.993 回答