首页 新闻 会员 周边

【求助】利用表达式树,能缓存 自定义的枚举器么?

0
悬赏园豆:50 [已解决问题] 解决于 2014-10-09 19:13

问题天天有,今天特别多,这是一个更加奇葩的问题,

 

话说,对于反射的方法,到是可以用 表达式树,对其缓存,以缓解性能问题,

不知道,自己定义枚举器这样的“类”能不?

之所以这样想,是因为可以,通过下面方法调用并得到解析

 Activator.CreateInstance(typeof(MyEnumerator<>).MakeGenericType........)

 

internal class MyEnumerator<T> : IEnumerator<T>

 

今天,遇到一个问题,如果能把一个 自己枚举器,缓存,就 牛X 了,不过,以我的脑容量及智力余额,当时就疯了,到现在,也没有想通这货是能还是不能,仍就疯言疯语中......

 

如果能,愿闻其详啊~

Srouni的主页 Srouni | 初学一级 | 园豆:9
提问于:2014-10-09 17:42
< >
分享
最佳答案
0

可以。表达式树其实就是我们代码的另一种表现形式,只是这个表现形式有点复杂而已。

如果要代码,你可以把你的反射代码贴出来,找时间帮你翻译成表达式。

收获园豆:50
519740105 | 大侠五级 |园豆:5810 | 2014-10-09 18:06

代码其实没有什么, 实现  IEnumerator<> 接口后,添加一个有参的构造函数。

class Program
    {
        static void Main(string[] args)
        {
            Type elementType = null;
            object result = Activator.CreateInstance(typeof(MyEnumerator<>).MakeGenericType(elementType), BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { "Ctor parameter" }, null);
        }

        internal class MyEnumerator<T> : IEnumerator<T>
        {
            internal MyEnumerator(string parameter)
            {

            }

            public string Current
            {
                get { throw new NotImplementedException(); }
            }

            public void Dispose()
            {
                throw new NotImplementedException();
            }

            object System.Collections.IEnumerator.Current
            {
                get { throw new NotImplementedException(); }
            }

            public bool MoveNext()
            {
                throw new NotImplementedException();
            }

            public void Reset()
            {
                throw new NotImplementedException();
            }
        }
    }

我这个描述,有点问题,我只是觉得每次调用都 MakeGenericType 我想应该是比较耗时的,能不能像缓存泛型方法一样,指定方法(这个是类了),加上泛型类型,在缓存中找中缓存的方法(这个是枚举器)直接执行获得结果,而不用再次 Make 了。

表达的有点乱..... 

Srouni | 园豆:9 (初学一级) | 2014-10-09 18:26

@Srouni: 那你这个就不需要使用表达式来表示了。

1、你确认Make很耗时?我认为应该不是很耗时的,这个你可以确认下。

2、按照你的需求,缓存范类型,可以使用字典来实现,这样的性能很高。

519740105 | 园豆:5810 (大侠五级) | 2014-10-09 18:35

@519740105:

这个问题,确实有点无聊啊..... 

Srouni | 园豆:9 (初学一级) | 2014-10-09 19:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册