2

私はそのような拡張機能を持っています...

public static class EventLibrary
{
    [EventCollection]
    public static Event Sequence(this Event ev)
    {
        ev.Started += (args) =>
        {
            // do something!
        }
    }
}

次に、イベント内で、次を使用してデリゲート サブスクライバーを調べます...

var dels = new List<Delegate[]>();
if (Started != null) 
    dels.Add(Started.GetInvocationList());

その理由は、この例のように、クロージャーを作成した関数に属性があるかどうかを検出しようとするためですEventCollection。Delegate オブジェクトでは、 と の両方が次のようなものDelcaringTypeReflectedType返しますEventLibrary+<Sequence>c_AnonStorey1が、これは私の知る限りです。

文字列操作なしでこれをやりたいのですが、それが可能かどうかはわかりません...誰か知っていますか?

4

1 に答える 1

0

それを確実に行う方法はないと思います。最も近い方法は、を取得することですが、のDeclaringTypeようなものはありませんDeclaringMethod

ラムダメソッドの名前を使用してみることができることにすでに気付いているようですが、そうすると壊れやすくなり(メソッドのオーバーロードはどうなりますか?)、他の言語(VB.NETなど)やコンパイラの将来のバージョンでは同じように機能しない可能性があります。

これを行うための最良の方法は、何とかEventしてあなたが望むものを伝えるように構成することだと思います。おそらく次のようなものです:

var eventCollectionEvent = ev.EventCollection;
eventCollectionEvent.Started += …;
于 2012-12-23T11:59:53.740 に答える