2

イベントを c# の別のイベントに反射的に直接接続できますか? それとも、物理的なメソッドをコーディングして 1 つのイベントを発生させ、反射的に他のイベントに接続できるようにする必要がありますか?

GetRaiseMethod() を使用する必要があると思っていたので、そうする必要はありませんでしたが、ドキュメントによると、c# は raise メソッドを生成しません。

そして、私が今尋ねたことが、私がやろうとしていることに対して完全に軌道から外れているように思われる場合は、軌道に乗るのを手伝ってください. 基本的に、私は 2 つのイベントを反射的に検索し、一方を他方に転送したいだけです。

4

4 に答える 4

3

何かイベントがあるとします

class A
{
    public event EventHandler<MyEventArgs> MyEvent;
}

そして他のイベント

class B
{
    public event EventHandler<MyEventArgs> MyOtherEvent;

およびそのイベントを発生させるメソッド

    protected void OnMyOtherEvent(MyEventArgs e)
    {
        var handler = MyEvent;
        if (handler != null)
            handler(this, e);
    }

次に、次のようにMyOtherEventいつでもレイズできます。MyEvent

    public B(A a)
    {
        a.MyEvent += (sender, e) => OnMyOtherEvent(e);
    }
}

事後により多くのデリゲートが追加される可能性があるため、イベントにMyOtherEventデリゲートを単純に追加することはできないことに注意してください。したがって、その間に何らかの方法が必要です。MyEventMyOtherEvent

于 2012-12-05T23:18:54.647 に答える
1

そして、私が今尋ねたことが、私がやろうとしていることに対して完全に軌道から外れているように思われる場合は、軌道に乗るのを手伝ってください. 基本的に、私は 2 つのイベントを反射的に検索し、一方を他方に転送したいだけです。

イベントは、直接「接続」されたものではありません。EventInfo.AddEventHandlerを使用して、デリゲートをイベントの新しいイベント ハンドラーとして追加できます。このデリゲートは、別のイベントを発生させるメソッドを含め、何でもかまいません。

イベントを発生させるメソッドと、そのメソッドの適切なデリゲートが必要です。これを行うと、それをイベント ハンドラーとして追加することができ、これは正しく通過します。

それとも、物理的なメソッドをコーディングして 1 つのイベントを発生させ、反射的に他のイベントに接続できるようにする必要がありますか?

はい、これは必須です。2 つのイベントを単に「接続」することはできません。2 番目のイベントを発生させる何か (メソッド) が必要です。

于 2012-12-05T23:20:01.197 に答える
0

イベントに関連する「On」メソッドを呼び出すイベントを発生させることができます。通常は実装されており、期待どおりに機能します。

ここに例があります

空のテキスト ボックスを作成する

        TextBox myTextBox = new TextBox();
        myTextBox.TextChanged += new EventHandler(myTextBox_TextChanged);

        void myTextBox_TextChanged(object sender, EventArgs e)
        {
            Console.WriteLine("something");
        }

TextChange イベントを発生させる

        MethodInfo mi = myTextBox.GetType().GetMethod("OnTextChanged", BindingFlags.Instance | BindingFlags.NonPublic);
        try
        {
            mi.Invoke(myTextBox, new object[] { EventArgs.Empty });
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);                
        }
于 2014-04-22T14:50:43.947 に答える
0

これは私が探していたものです:

public event Action evt

public void RaiseEvent()
{
    var type = GetType();
    var fld = type.GetField("evt", BindingFlags.NonPublic | BindingFlags.Instance);
    var fldValue = (MulticastDelegate)fld.GetValue(this);
    fld.DynamicInvoke();
}
于 2012-12-06T00:03:06.073 に答える