1

我在这里有一个事件,它使用包含动态对象的参数触发。它是直接在事件调用本身中创建的匿名对象,例如

if(MyEvent != null) MyEvent(this, new SensoricDataEventArgs { Data = new { Action = "Start", Team = "Blau" } });

其中SensoricDataEventArgs的签名是这样的:

class SensoricDataEventArgs : EventArgs {
  public dynamic Data { get; set; }
}

当我尝试在处理程序中访问该数据时(在另一个程序集中,如果相关的话),我得到的只是对象没有Action定义的异常,即使我将 Data 属性重新转换为动态的。甚至动态对象的 DebuggerVisualizer也显示对象上有一个属性Action

但是,我得到了提到的异常。

这是我在事件处理程序中尝试执行的操作的图像,以及来自调试器的信息。在图像中,调试器已在断点处停止。下一步将引发异常。

知道是什么导致了这个异常吗?我究竟做错了什么? MyEvent 处理程序

4

2 回答 2

3

问题是声明了匿名类型internal,因此您尝试访问的成员在其他程序集中不可见,并且 DLR 实际上在运行时对成员可访问性进行相同的编译时分析。它不会让您在运行时访问您在编译时无法访问的东西。它看到匿名类型是internal并抛出一个RuntimeBinderException.

一种解决方案是显式编写反射代码,而不是使用dynamic. 一个更易于维护的长期解决方案是dynamic从事件参数中删除并更精确地定义您的组件如何相互通信。

于 2013-04-21T09:30:29.677 回答
0

另一种解决方案是使用ExpandoObject而不是匿名对象。

在我的特殊情况下,并考虑到时间紧迫(截止日期临近)的事实,我将使用此解决方法,而不是重新考虑我的整个架构并冒着与已完成插件不兼容的风险。它可以工作并且保持兼容性。

于 2013-04-21T10:13:08.073 回答