イベントハンドラ内から値の引数を変更するにはどうすればよいですか?

私は bool を参照によって別のクラスのメソッドに渡していますので、メソッド内から元の引数を変更することができます。

私はまた、イベントを変更することができるイベント(そのメソッドによってサブスクライブされている)が必要です。

これを行う:

class myCheckBox : CheckBox
{
    bool b1;
    public myCheckBox(ref bool b)
    {
        b1 = b;
        this.CheckedChanged += new EventHandler(myCheckBox_CheckedChanged);
    }

    void myCheckBox_CheckedChanged(object sender, EventArgs e)
    {
        b1 = Checked;
    }
}

b1はbのコピーにすぎないので、助けにならない。

どのようなやり方がありますか? ref b1 = ref b; ?そうでない場合、どうすればこの問題を解決できますか?

(例は質問を説明するためのものです)。

1
@dowhilefor私がしようとしているのは、関連するboolを変更する自動チェックボックスクラスを作成することです。
追加された 著者 ispiro,
多分あなたはこれのためにボクシングを使うことができます。とにかく、あなたがやろうとしていることをむしろ奇妙に思うので、それを避けるべきです。
追加された 著者 dowhilefor,

4 答え

通常、イベントハンドラに引数を渡します。この引数には、イベントハンドラによって変更できるブール値のプロパティがあります。

public class MyEventArgs : EventArgs
{
    public bool Value { get; set; }
}

public class MyClass
{
    public void method1(ref bool b)
    {
        MyEventArgs e = new MyEventArgs()
        {
            Value = b
        };
        eventMethod(e);

        b = e.Value;
    }

    void eventMethod(MyEventArgs e)
    {
        e.Value = false;
    }
}

You may also want to take a look at the standard event handler pattern established in .NET: How to: Publish Events that Conform to .NET Framework Guidelines (C# Programming Guide)

4
追加された
編集されたコードを参照してください。
追加された 著者 ispiro,
あなたがしようとしているのは、カプセル化のOOP原則に違反しています。あるクラスが別のクラスの内部状態を変更させるようにしています。通常、イベントハンドラを同じクラスのイベントに接続することはありません。独自のメソッドを直接呼び出すことができます。より洗練されたアプローチは、 CheckedChanged イベントをサブスクライブして自身を更新するブール値フィールドを実際に含むクラスを持つことです。
追加された 著者 Joel C,

フィールドを含むクラス、それを示す文字列を渡し、b1の代わりに保存します。その後、反射を使用します。

See How to create a reference to a value-field

1
追加された

b1 をクラスの公開フィールドにします。

または、公共ゲッターとパブリックセッターを備えた不動産を持つ私的なもの。

0
追加された

コードをコンソールアプリケーションにコピーしたとき(静的関数とvar b1に変更しなければならない)、メインから呼び出されたときに、

bool b = true;
method1(ref b);
Console.writeLine(b1);

「偽」を印刷します....

0
追加された
私が欲しいのはConsole.writeLine( b )です。 「偽」を印刷する。
追加された 著者 ispiro,