查找封闭闭包/ lambda的函数的属性

时间:2012-12-23 11:40:19

标签: c# .net reflection

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

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对象上,DelcaringTypeReflectedType都返回EventLibrary+<Sequence>c_AnonStorey1之类的内容,但这是我得到的。

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

1 个答案:

答案 0 :(得分:0)

我相信没有办法可靠地做到这一点。您最接近的是获取DeclaringType,但没有DeclaringMethod之类的内容。

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

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

var eventCollectionEvent = ev.EventCollection;
eventCollectionEvent.Started += …;