我似乎突然碰到了下面的
据我所知,在自由基础上进行反射可能会很昂贵,而且不会引起注意。 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>;
}
这会被视为代码会将性能降低到不保证不使用它的程度吗?
答案 0 :(得分:1)
首先,很可能这不是您的应用程序的一部分,而是您的瓶颈。例如,您对存储库模式的使用表明您正在与数据库通信。这将明显慢于此处发布的代码。分析您的应用程序,看看什么是缓慢的,因此值得花时间优化。
Seocndly,为了解决您的代码,您应该注意的唯一潜在问题是,当您返回IEnumerable时,可能会多次评估这会导致代码多次运行。为了减轻增加的复杂性,你需要缓存结果,以便只调用一次。
答案 1 :(得分:0)
缓存方法,然后在Map中调用它。然后反射性能命中只会一次。