【问题标题】:Best way to cache a reflection property getter / setter?缓存反射属性获取器/设置器的最佳方法?
【发布时间】:2011-12-21 10:17:13
【问题描述】:

我知道反射可能很昂贵。我有一个经常获取/设置属性的类,我想的一种方法是以某种方式缓存反射。我不确定我是否应该缓存一个表达式或在这里真正做什么。这就是我目前正在做的事情:

typeof(T).GetProperty(propName).SetValue(obj, value, null);
typeof(T).GetProperty(propName).GetValue(obj, null);

那么...什么是加快速度的最佳方法?

【问题讨论】:

    标签: c# performance caching reflection properties


    【解决方案1】:

    你应该缓存

    的结果
    typeof(T).GetProperty(propName); 
    

    typeof(T).GetProperty(propName);
    

    另一种可能的方法是将PropertyInfo.GetGetMethod Method (或PropertyInfo.GetSetMethod Method 用于setter)与Delegate.CreateDelegate Method 组合,并在每次需要获取/设置值时调用生成的委托。如果你需要它来使用泛型,你可以使用这个问题的方法:CreateDelegate with unknown types

    这应该比反射快得多: Making reflection fly and exploring delegates

    还有其他方法可以更快地获取/设置值。您可以使用表达式树或 DynamicMethod 在运行时生成 il。看看这些链接:

    Late-Bound Invocations with DynamicMethod

    Delegate.CreateDelegate vs DynamicMethod vs Expression

    【讨论】:

    • +1,如果你想要最好的表现,代表是要走的路
    • 代表似乎是要走的路,但那篇文章有点过头了。你能举一个关于我用它做什么的例子吗?
    • 你说“你应该缓存X和Y的结果”,但是X和Y是一回事?
    【解决方案2】:

    嗯,最简单的答案是你可以缓存GetProperty返回的PropertyInfo对象:

    var propInfo = typeof(T).GetProperty(propName);
    propInfo.SetValue(obj, value, null);
    propInfo.GetValue(obj, null);
    
    // etc.
    

    这将消除反射在类中重复查找属性并消除大部分性能损失的需要。

    【讨论】:

      【解决方案3】:

      Marc Gravell 写了一篇关于他的 HyperDescriptor 的精彩文章。 它应该提供更快的运行时反射属性访问。

      【讨论】:

        【解决方案4】:

        只需存储对从以下位置返回的PropertyInfo 的引用:

        typeof(T).GetProperty(propName)
        

        【讨论】:

          猜你喜欢
          • 2012-12-30
          • 2017-05-14
          • 2014-12-31
          • 1970-01-01
          • 1970-01-01
          • 2014-07-24
          • 2012-02-05
          • 2011-10-13
          相关资源
          最近更新 更多