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になることはありますが、NULLになることはありません。
私は次の問題を管理しました:
Visual Studioで[ツール\オプション...\デバッグ\一般]に移動し、[プロパティ評価とその他の暗黙的な関数呼び出しを有効にする]を無効にし、[プロパティと演算子のステップオーバー(管理対象のみ)]を有効にします。
多分それは助けになります。

于 2010-02-08T14:38:15.703 に答える
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;
}

サイモン・リンダーが説明したのと同じ方法で使用してください。

于 2010-02-16T23:49:32.783 に答える
0

過去に、 this.DesignMode は常に完全に信頼できるとは限らないと言われました。使用できる他のオプションは、プリプロセッサ ディレクティブです。

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

次に、DESIGN という名前の条件付きコンパイル シンボルを追加すると、ゴールデンになるはずです。

于 2010-02-16T01:14:33.450 に答える
0

デザイナーが IsConnected プロパティを持たない古いバージョンのコントロール DLL を使用しているようです。

MissingMethodException 例外は、m_A の値とは関係ありません。プロパティが欠落していると不平を言っているのはJITコンパイラです。メソッドで m_A.IsConnected への呼び出しをラップすると、このメソッドは呼び出されず (m_A が実際には null であるため)、jitted されず、IsConnected プロパティは必要ないため、機能します。

コントロールを VS のフォームに配置すると、デザイナーはフォーム内にコントロールの「実際の」インスタンスを作成し、コンストラクターを呼び出します。これにより、JIT コンパイルの問題が発生します。

于 2010-02-23T14:43:24.993 に答える