2

我有一个扩展功能......

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

然后,在 Event 内部,我使用以下命令查看委托订阅者...

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

原因是尝试检测创建闭包的函数是否具有属性,如本例所示EventCollection。在 Delegate 对象上,两者都DelcaringType返回类似的ReflectedType东西,EventLibrary+<Sequence>c_AnonStorey1但据我所知。

我很想在没有任何字符串操作的情况下做到这一点,但我不确定这是否可能......有人知道吗?

4

1 回答 1

0

我相信没有办法可靠地做到这一点。你能做的最接近的是得到DeclaringType,但没有类似的东西DeclaringMethod

您似乎已经注意到您可以尝试使用 lambda 方法的名称,但这样做会很脆弱(方法重载呢?)并且在其他语言(如 VB.NET)或未来版本的编译器中可能无法正常工作.

我认为最好的方法是通过某种方式配置Event来告诉它你想要什么。可能是这样的:

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