本文介绍了为什么C#动态解析内部属性而不是方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述 我有以下类的库: 公共接口IEntity {串富{搞定; } 无效栏(INT X); } 公共类EntityFactory {公共静态IEntity createEntity() {返回新实体(); } } 内部实体类:DynamicObject,IEntity {公共无效酒吧(INT X) { Console.WriteLine(内酒吧); Console.WriteLine(巴{0},X); } 公共字符串美孚 {得到 { Console.WriteLine(内富吸气); 返回富; } } 公众覆盖布尔TryInvokeMember(InvokeMemberBinder粘合剂,对象[] ARGS,out对象结果) { Console.WriteLine(内幕TryInvokeMember(binder.Name ='{0}'),binder.Name); 返回base.TryInvokeMember(粘合剂,ARGS,出结果); } 公众覆盖布尔TryGetMember(GetMemberBinder粘结剂,out对象结果) { Console.WriteLine(内TryGetMember(binder.Name ={0} '),binder.Name); 如果(binder.Name ==SomeVar) {结果= 42; 返回真; } 返回base.TryGetMember(粘合剂,出结果); } } 和程序使用它们: 公共静态无效的主要(字串[] args) {动态的实体= EntityFactory.createEntity(); Console.WriteLine(entity.Foo = {0},entity.Foo); entity.Bar(24); Console.WriteLine(entity.SomeVar = {0},entity.SomeVar); } 输出为 内内TryInvokeMember富吸气 entity.Foo = foo的(binder.Name ='酒吧')$ b $内TryGetMember(binder.Name b ='酒吧') 然后我收到一个异常 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:`EntityLib.Entity.Bar(INT)'不可访问由于其保护级别 为什么动态对象访问属性富直接,但无法调用方法酒吧和使用 TryInvokeMember 和 TryGetMember 呢?它们具有相同的访问修饰符 更新:所描述的行为在Mono观察。微软已经失败访问富属性时。下面的代码按预期工作: 公共静态无效的主要(字串[] args) {变种实体= EntityFactory.createEntity(); entity.Bar(24); Console.WriteLine(entity.Foo = {0},entity.Foo); 动态E =实体; Console.WriteLine(entity.SomeVar = {0},e.SomeVar); } 这是否是一个错误或功能是由微软决定。不过,我希望在转换变量动态不应限制访问。 解决方案 内部类实体.... 的的动态的关键字不是一个解决方法受限访问性。实体类被声明的内部的,所以试图从代码不是实体家住将是由粘结剂被拒绝组件的一部分调用它的酒吧()方法,该消息没有留下来想象: The logical way to get ahead is to declare the Entity class public. If that's a problem for some reason then you can break the rules with Reflection. You'll need to use BindingFlags.NonPublic | BindingFlag.Instance options in the Type.GetMethod() call.As to the core question, I'll happily dismiss that as a bug. The C# DLR binder is impossible to reverse-engineer. Not in the least because the code for it isn't included in the Reference Source, Microsoft does appear to treat it like a trade secret. It is. You can file it at connect.microsoft.com 这篇关于为什么C#动态解析内部属性而不是方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持! 09-24 22:26