反思表现关注

时间:2014-03-03 12:42:22

标签: c# .net performance reflection

我似乎突然碰到了下面的

据我所知,在自由基础上进行反射可能会很昂贵,而且不会引起注意。 How costly is .NET reflection?

但是说我有following,我打算在我的网络API端点上使用它。像这样:

  public AnotherDto Get(int someId)
  {
      var item = this.repo.FindAll(o => o.Id == someId)
                          .Take(1).Map<SomeDto>()
                          .FirstOrDefault();   

      var result = this.otherRepo
                       .FindAll(o => o.Id == item.Id)
                       .Map<AnotherDto>();    

      return result;
  }

地图&lt;&gt;()

public static IEnumerable<U> Map<U>(this IEnumerable<object> e)
    {
        var method = typeof(EntityExtensions).GetMethods(BindingFlags.Static | BindingFlags.Public)     
        .Where(m => m.Name == "Map" && m.GetGenericArguments().Length == 2)
        .Single();
        method = method.MakeGenericMethod(e.GetType().GetGenericArguments()[0], typeof(U));

        return method.Invoke(null, new object[] { e}) as IEnumerable<U>;
    }

这会被视为代码会将性能降低到不保证不使用它的程度吗?

2 个答案:

答案 0 :(得分:1)

首先,很可能这不是您的应用程序的一部分,而是您的瓶颈。例如,您对存储库模式的使用表明您正在与数据库通信。这将明显慢于此处发布的代码。分析您的应用程序,看看什么是缓慢的,因此值得花时间优化。

Seocndly,为了解决您的代码,您应该注意的唯一潜在问题是,当您返回IEnumerable时,可能会多次评估这会导致代码多次运行。为了减轻增加的复杂性,你需要缓存结果,以便只调用一次。

答案 1 :(得分:0)

缓存方法,然后在Map中调用它。然后反射性能命中只会一次。