首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >访问动态属性引发了'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException‘类型的异常

访问动态属性引发了'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException‘类型的异常
EN

Stack Overflow用户
提问于 2020-11-16 19:29:15
回答 1查看 581关注 0票数 0

我将一个处理程序函数作为参数传递给另一个函数。处理程序的一个参数是动态对象,我正在访问它的一个属性。

下面是一个示例:

代码语言:javascript
运行
复制
    protected virtual void OnTime(dynamic timed, HttpResponseMessage response, TimeSpan time)
    {
        _logger.Write(timed?.name);
    }

下面是如何调用处理程序:

代码语言:javascript
运行
复制
OnTime?.Invoke(new {name = dto.name, dto, request }, httpResponseMessage, elapsed);

这个效果很好。然后我把一些东西弄乱了,它坏了。动态对象与其所有属性一样出现,但现在timed?.name抛出Microsoft.CSharp.RuntimeBinder.RuntimeBinderException异常,抱怨对象没有属性name的定义。

我看了这些答案,找出了一个解决办法:

Why does the assignment from a dynamic object throw a RuntimeBinderException?

Dynamic throwing Microsoft.CSharp.RuntimeBinder.RuntimeBinderException on private types

以及以下工作:

代码语言:javascript
运行
复制
Dictionary<string, object> values = ((object)timed)
                                 .GetType()
                                 .GetProperties()
                                 .ToDictionary(p => p.Name, p => p.GetValue(v));

(Get properties of a Dynamic Type)

但我不知道为什么直接访问停止工作。有什么想法吗?谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-16 19:39:58

我发现了它破裂的原因。最初,处理程序和传入的函数都属于同一个程序集。在重构之后,处理程序和调用它的对象被分割成不同的项目和名称空间,从而防止了编译时的绑定。

解决方案是不再传递动态对象,而是传递序列化对象:

代码语言:javascript
运行
复制
OnTime?.Invoke(JsonConvert.SerializeObject(new { name = dto.Name, dto, request }), httpResponseMessage, elapsed);

然后将其消费为:

代码语言:javascript
运行
复制
    protected virtual void OnTime(string timed, HttpResponseMessage response, TimeSpan time)
    {
        var operation = JsonConvert.DeserializeAnonymousType(timed, new { name = string.Empty });

        _logger.Write(operation.name);
    }

因此,解耦需要额外的序列化步骤,但允许更多地重用代码。

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

https://stackoverflow.com/questions/64864491

复制
相关文章

相似问题

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