C# 无垃圾地通过反射获取值

C# 无垃圾地通过反射获取值,c#,reflection,garbage,C#,Reflection,Garbage,我正在编写一个系统,要求我获取对象中属性的值,最好使用反射。这个项目是针对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().In

我正在编写一个系统,要求我获取对象中属性的值,最好使用反射。这个项目是针对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
我不喜欢这样有两个原因:

  • 铸造是给陶工的,泛型是给程序员的
  • 很明显,每次我必须得到一个原语值并将其装箱时,它都会创建垃圾
是否有一些从属性中获取值的通用方法,这些方法不会对基本体进行装箱

编辑::作为对Jon回答的回应,从他的博客中窃取的代码不会导致分配,问题已解决:

        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");
        }
String methodName=“IndexOf”;
类型[]argType=新类型[]{typeof(char)};
String testWord=“快速浏览信息跳转到Helazydog”;
MethodInfo method=typeof(string).GetMethod(methodName,argType);
Func converted=(Func)Delegate.CreateDelegate
(typeof(Func)、testWord、method);
int count=GC.CollectionCount(0);
对于(int i=0;i<10000000;i++)
{
int l=转换后的('l');
如果(GC.CollectionCount(0)!=计数)
控制台。写入线(“收集”);
}

另一种方法是使用getter方法创建委托-我不知道Xbox使用的compact framework版本是否支持该方法


我有一个on
Delegate.CreateDelegate
,您可能会发现它很有用-但您需要再次了解其中有多少适用于Xbox。

ha,我可能会窃取您的“potters”报价;)啊,看起来很有趣,我今晚回家后会在控制台上做些调查。出于兴趣,你的协议缓冲库产生了多少垃圾?@Martin:老实说,我不知道。我们所有的构建值都是不可变的,这自然会导致更多的垃圾-但这实际上取决于您如何使用它。我怀疑delegate.CreateDelegate正在从其内部的装箱基元类型进行强制转换:/看起来我必须设计一个新的体系结构:(对不起,我之前很忙。创建委托相对来说比较昂贵-如果可能的话,每个属性只能执行一次。但是,调用它应该非常便宜-比通过反射调用giong要便宜得多。我在回答中附加的测试已分配,但我将更新测试,使其略有不同,这不公平。这是一个仓促的糟糕的笔试。