我正在编写一个系统,它要求我获取对象中属性的值,最好使用反射。这个项目是针对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
我不喜欢这个有两个原因:
是否有一些通用方法可以从属性中获取值,而不会对基元进行包装?
编辑::回应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");
}
答案 0 :(得分:2)
另一种方法是使用Delegate.CreateDelegate
从getter方法创建委托 - 我不知道Xbox使用的紧凑框架版本是否支持它。
我在Delegate.CreateDelegate
上有blog post您可能会觉得有用 - 但同样,您需要了解它有多少适用于Xbox。