代码之家  ›  专栏  ›  技术社区  ›  Martin

通过无垃圾的反射获取值

  •  3
  • Martin  · 技术社区  · 14 年前

    我正在编写一个系统,它要求我获取对象中属性的值,最好使用反射。这个项目是针对Xbox360的,它运行在紧凑的框架上,因此有一个缓慢的垃圾收集器——这意味着我避免分配是绝对重要的!

    我找到的唯一方法是:

    Foo Something; //an object I want to get data from
    PropertyInfo p; //get this via reflection for the property I want
    object value = p.GetGetmethod().Invoke(Something, null);
    //Now I have to cast value into a type that it should be
    

    我不喜欢这个有两个原因:

    • 铸造是为陶工,泛型是为程序员。
    • 很明显,每次我必须得到一个原语值并装箱时,它都会创建垃圾。

    是否有一些从属性中获取值的通用方法,而不是框原语?

    edit::作为对jons答案的响应,从他的博客中窃取的代码不会导致分配,问题已解决:

            String methodName = "IndexOf";
            Type[] argType = new Type[] { typeof(char) };
            String testWord = "TheQuickBrownFoxJumpedOverTheLazyDog";
    
            MethodInfo method = typeof(string).GetMethod(methodName, argType);
    
            Func<char, int> converted = (Func<char, int>)Delegate.CreateDelegate
                (typeof(Func<char, int>), testWord, method);
    
            int count = GC.CollectionCount(0);
    
            for (int i = 0; i < 10000000; i++)
            {
                int l = converted('l');
    
                if (GC.CollectionCount(0) != count)
                    Console.WriteLine("Collect");
            }
    
    1 回复  |  直到 14 年前
        1
  •  1
  •   Jon Skeet    14 年前

    另一种选择是使用 Delegate.CreateDelegate -不过,我不知道Xbox使用的紧凑框架版本是否支持这一点。

    我有一个 blog post 委托.创建委托 您可能会发现这一点很有用——但同样,您需要了解其中有多少适用于Xbox。