在某些条件下找不到扩展方法(奇怪的框架行为与变通方法)

时间:2016-09-30 18:05:04

标签: c# extension-methods

免责声明:对于一个简短的结论可能是一个很长的解释,但这是一个奇怪的情况,有很多因素可以达到它,我不知道它们中的任何一个对最终结果是否有影响,所以我是我将尽力提供所有背景信息。

我正在开发一个带有一些misc实用程序的库,添加一些扩展方法等等......

其中一种方法是这样定义的:

public static class EventInfoExtensions
{
    public static void EventInfoExtensionMethod(this EventInfo ev)
    {
         //my code here
    }
}

我可以毫无问题地使用它,但我遇到了一个奇怪的情况。首先是一些背景:

我已经定义了一个像这样的DynamicObject类:

public class DynamicObjectBase<T> : DynamicObject
{
    public T BaseObj { get; set; }

    public DynamicObjectBase(T obj)
        : base()
    {
        this.BaseObj = obj;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        //code for getting member
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        //code for setting member
    }
}

经过测试,没有任何问题。然后我必须将第一个扩展方法应用于BaseObj上的所有事件,以获取DynamicObjectBase的列表(运行时的未知类型)。像这样:

public void ApplyToEvents(IList list)
{
     foreach(var item in list.Select(x => (x as dynamic).BaseObj))
    {
        item.GetType().GetEvents().EventInfoExtensionMethod();
    }
}

就是这样。 Intellisense显示了该方法,它构建时没有错误,但是如果我执行代码它会抛出异常:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Reflection.EventInfo' does not contain a definition for 'EventInfoExtensionMethod'

(翻译自西班牙语,可能会改为英文)

这是奇怪的事情。事实上,如果我尝试在Visual Studio中“转到定义”它告诉我它找不到方法。

我已经采用了这种解决方法,它似乎有效:

public void ApplyToEvents(IList list)
{
     foreach(var item in list.Select(x => x.GetType().GetProperty("BaseObj")))
    {
        item.GetType().GetEvents().EventInfoExtensionMethod();
    }
}

现在它运行时没有任何错误,Visual Studio允许我“{定义”EventInfoExtensionMethod。问题是:有没有人经历过这个?可能导致“动态”铸造吗?

我一直在努力工作几个小时,并且在那里发布它的目的是因为我真的不明白会发生什么,如果有人有这个问题,那么可能有一种解决方法。

如果你达到了这一点:谢谢! :)

0 个答案:

没有答案