直接上代码:
using System.Dynamic; using System.Linq.Expressions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { dynamic expando = new T(); expando.a = 1; } public class T : IDynamicMetaObjectProvider { dynamic _context = new D(); int c = 0; public DynamicMetaObject GetMetaObject(Expression parameter) { c++; return (_context as D).GetMetaObject(parameter); } public class D : DynamicObject { } } } }
以上代码在调试的时候,发现:
1、虽然expando在创建的时候(new T()),c的值为0,但是:进入接口实现 GetMetaObject,c的值是不确定的。
2、当 执行 expando.a = 1; 语句 触发 接口 GetMetaObject 调用后,会一直死循环。
表示看不懂这种用法...
晕倒。只不过是写一个proxy而已。
就是:
1、自己写了一个继承自DynamicObject的类,实现一些功能。
2、由于某些特殊的用途,必须写另外一个动态支持类,但又需要继承自别的基类,于是用了这个策略。
@519740105: https://gist.github.com/breezhang/8954586 看看有没有帮助。
如果不死循环就有问题了。
自己强制修改一些代码,解决咯。
解决了贴出来分享下哇。
@幻天芒: 估计有性能问题。头痛的就是表达式的生成与表示上,过两天放到群里。
@519740105: 什么场景,需要这样的做法呢?
@幻天芒: 简单,就是想自己写一个动态对象支持类,然后不直接对外公开。
@519740105: 好吧,表示现在很少用C#了,似乎也用不到这种场景,哈哈~