首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态上的“行动”没有定义吗?

动态上的“行动”没有定义吗?
EN

Stack Overflow用户
提问于 2013-04-21 09:04:57
回答 2查看 62关注 0票数 1

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

代码语言:javascript
复制
if(MyEvent != null) MyEvent(this, new SensoricDataEventArgs { Data = new { Action = "Start", Team = "Blau" } });

其中SensoricDataEventArgs的签名如下所示:

代码语言:javascript
复制
class SensoricDataEventArgs : EventArgs {
  public dynamic Data { get; set; }
}

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

然而,我得到了提到的例外。

下面是我试图在事件处理程序中所做的事情的图像,以及调试器的信息。在图像中,调试器已停止在断点上。下一步抛出异常。

知道是什么导致了这个异常吗?我做错了什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-21 09:30:29

问题是匿名类型被声明为internal,所以您试图访问的成员在其他程序集中是不可见的,DLR实际上在运行时对成员可访问性进行了相同的编译时分析。它将不允许您在运行时访问某些在编译时无法访问的内容。它看到匿名类型是internal并抛出一个RuntimeBinderException

一种解决方案是显式地编写反射代码,而不是使用dynamic。一个更可维护、更长远的解决方案是从事件args中删除dynamic,并更精确地定义组件之间的通信方式。

票数 3
EN

Stack Overflow用户

发布于 2013-04-21 10:13:08

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16129556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档