【问题标题】:Fastest way to copy objects [duplicate]复制对象的最快方法[重复]
【发布时间】:2017-05-16 14:49:35
【问题描述】:

我在 c# 中有一个对象,需要多次快速复制。

目前我正在使用

public static void CopyFieldsInto<T>(T from, T to,bool ommitNulls=false) where T : new()
{
     foreach (var f in GetAllFieldsByType<T>())
     {
          var v = f.GetValue(from);
          if (ommitNulls&&v==null)
          {
              continue;
          }
          f.SetValue(to, v);
     }
}

问题在于GetValueSetValue 耗时太长,速度变慢。

有没有更好的方法来做到这一点?

【问题讨论】:

  • 你控制对象的源代码吗?您可以实现一个对此有所帮助的接口,然后您就不需要使用反射了。如果您必须能够对任意对象执行此操作,那么反射是您唯一的选择。
  • 我正在考虑这样做。但是,手动浏览每个字段非常耗时,并且可能会在以后添加其他字段并忘记在克隆方法中提及它们时引起问题
  • @ArsenZahray 逐个字段手动编码克隆是迄今为止最快的选择(就性能而言)。
  • XmlSerializer 实际上为每种类型生成和编译代码。另外我不知道FormatterServices.PopulateObjectMembers() 的表现如何,可能值得一试。

标签: c# reflection clone system.reflection


【解决方案1】:

如果需要使用反射来复制对象的属性,那么没有办法避免使用GetValueSetValueHere 是另一种与您类似的方法。也可能值得考虑使用AutoMapper 或类似的工具。

【讨论】:

  • "没有办法避免使用 GetValue 和 SetValue"?没有人强迫您这样做 - 您可以发出代码(源代码、IL 或表达式树)来这样做 - stackoverflow.com/questions/321650/…
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 2011-03-10
相关资源
最近更新 更多