gpt4 book ai didi

c# - 我使用反射的自定义映射可以更快吗?

转载 作者:行者123 更新时间:2023-11-30 20:53:24 24 4
gpt4 key购买 nike

我有以下方法将源对象映射到重复的目标对象。但是,只有某些标有特定属性的属性需要映射到新对象上。

我的映射器目前看起来如下:

public static class BaseObjectExtensions
{
private static readonly Dictionary<string, Attribute[]> AttributeCache = new Dictionary<string, Attribute[]>();
private static readonly Dictionary<string, PropertyInfo[]> PropertyCache = new Dictionary<string, PropertyInfo[]>();

public static void Map(this IBaseObject destination, IBaseObject source)
{
if (source == null)
{
return;
}

var t = source.GetType();
PropertyInfo[] properties;
lock (PropertyCache)
{
if (!PropertyCache.TryGetValue(t.FullName, out properties))
{
properties = t.GetProperties();
PropertyCache.Add(t.FullName, properties);
}
}

lock (AttributeCache)
{
foreach (PropertyInfo prop in properties)
{
Attribute[] attrs;
string k = t.FullName + prop;
if (!AttributeCache.TryGetValue(k, out attrs))
{
attrs = Attribute.GetCustomAttributes(prop);
AttributeCache.Add(k, attrs);
}

if (attrs.OfType<DatabaseMap>().Any())
{
prop.SetValue(destination, prop.GetValue(source));
}
}
}
}
}

此 map 既可以用于单个项目,也可以用于项目集合。我注意到性能瓶颈,所以经过大量研究后我添加了两个缓存。大量项目的时间如下:

  • 没有反射缓存:26.6 秒
  • 使用反射缓存(ConcurrentDictionary):31 秒
  • 使用反射缓存(锁定):4 秒

加速非常显着,但我认为它还可以更好。经过大量阅读,我发现了类似 FastInvoke 的内容和 another FastInvoke但似乎无法将它们应用到我想要完成的事情上。

我还能做些什么来加快速度吗?

最佳答案

我认为为了获得最佳性能,您应该使用 Reflection.Emit 编译映射器,或者使用已经存在的之一:Emit mapper vs valueinjecter or automapper performance

关于c# - 我使用反射的自定义映射可以更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019150/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com