【发布时间】: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);
}
}
问题在于GetValue 和SetValue 耗时太长,速度变慢。
有没有更好的方法来做到这一点?
【问题讨论】:
-
你控制对象的源代码吗?您可以实现一个对此有所帮助的接口,然后您就不需要使用反射了。如果您必须能够对任意对象执行此操作,那么反射是您唯一的选择。
-
我正在考虑这样做。但是,手动浏览每个字段非常耗时,并且可能会在以后添加其他字段并忘记在克隆方法中提及它们时引起问题
-
@ArsenZahray 逐个字段手动编码克隆是迄今为止最快的选择(就性能而言)。
-
XmlSerializer实际上为每种类型生成和编译代码。另外我不知道FormatterServices.PopulateObjectMembers()的表现如何,可能值得一试。
标签: c# reflection clone system.reflection