免责声明:对于一个简短的结论可能是一个很长的解释,但这是一个奇怪的情况,有很多因素可以达到它,我不知道它们中的任何一个对最终结果是否有影响,所以我是我将尽力提供所有背景信息。
我正在开发一个带有一些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
。问题是:有没有人经历过这个?可能导致“动态”铸造吗?
我一直在努力工作几个小时,并且在那里发布它的目的是因为我真的不明白会发生什么,如果有人有这个问题,那么可能有一种解决方法。
如果你达到了这一点:谢谢! :)