首页 新闻 会员 周边

.net 动态对象的一个奇怪问题:自动死循环调用

0
悬赏园豆:10 [已解决问题] 解决于 2016-02-04 11:01

直接上代码:

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 调用后,会一直死循环。

519740105的主页 519740105 | 大侠五级 | 园豆:5810
提问于:2016-02-01 17:28
< >
分享
最佳答案
0

表示看不懂这种用法...

收获园豆:10
幻天芒 | 高人七级 |园豆:37175 | 2016-02-02 09:49

晕倒。只不过是写一个proxy而已。

519740105 | 园豆:5810 (大侠五级) | 2016-02-02 09:55

就是:

 

1、自己写了一个继承自DynamicObject的类,实现一些功能。

2、由于某些特殊的用途,必须写另外一个动态支持类,但又需要继承自别的基类,于是用了这个策略。

519740105 | 园豆:5810 (大侠五级) | 2016-02-02 09:56

@519740105: https://gist.github.com/breezhang/8954586  看看有没有帮助。

幻天芒 | 园豆:37175 (高人七级) | 2016-02-02 11:58
其他回答(2)
0

如果不死循环就有问题了。

埋头前进的码农 | 园豆:118 (初学一级) | 2016-02-03 18:02
0

自己强制修改一些代码,解决咯。

519740105 | 园豆:5810 (大侠五级) | 2016-02-04 11:01

解决了贴出来分享下哇。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2016-02-04 22:03

@幻天芒: 估计有性能问题。头痛的就是表达式的生成与表示上,过两天放到群里。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2016-02-05 12:11

@519740105: 什么场景,需要这样的做法呢?

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2016-02-05 13:22

@幻天芒: 简单,就是想自己写一个动态对象支持类,然后不直接对外公开。

支持(0) 反对(0) 519740105 | 园豆:5810 (大侠五级) | 2016-02-05 13:44

@519740105: 好吧,表示现在很少用C#了,似乎也用不到这种场景,哈哈~

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2016-02-05 14:56
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册