我有两个来自这个类的对象:
public class A
{
public int Id { get; set; }
public string Name { get; set; }
public IList<B> Bs { get; set; }
}
public class B
{
public string Description { get; set; }
public IList<C> Cs { get; set; }
}
public class C
{
public string Description { get; set; }
}现在,我想用FastMember遍历这两个对象实例的所有属性,并将属性从object 1复制到object 2。
这是我到目前为止得到的结果(不起作用!)
// Set accessors
var sourceAccessor = ObjectAccessor.Create(object1);
var targetAccessor = ObjectAccessor.Create(object2);
foreach (var sourceItem in (IList)sourceAccessor.Target)
{
var targetItemAccessor = ObjectAccessor.Create(targetAccessor.Target);
var sourceItemAccessor = ObjectAccessor.Create(sourceItem);
// Overwrite property
targetItemAccessor[p] = sourceItemAccessor[p];
}这段代码显然不是working...any的想法?谢谢!
发布于 2019-09-28 02:58:21
您可以在TypeAccessor的帮助下使用以下命令创建shallow copy:
var sourceAccessor = ObjectAccessor.Create(object1);
var targetAccessor = ObjectAccessor.Create(object2);
var access = TypeAccessor.Create(typeof(A));
var members = access.GetMembers();
foreach (var member in members)
{
targetAccessor[member.Name] = sourceAccessor[member.Name];
}看看FastMember tests中的用法示例。
对于深度复制,您可以检查属性名或使用property type来确定是否应用deep copy of lists或浅复制是否足够。
编辑:下面是一个简化版本的示例,它递归地复制IList类型的属性(请参阅此question了解如何确定哪个属性是列表),假设源对象和目标对象的列表具有相同的长度:
private static void MirrorObject(object object1, object object2)
{
var sourceAccessor = ObjectAccessor.Create(object1);
var targetAccessor = ObjectAccessor.Create(object2);
var access = TypeAccessor.Create(object1.GetType());
var members = access.GetMembers();
foreach (var member in members)
{
if (member.Type.IsGenericType && (member.Type.GetGenericTypeDefinition() == typeof(IList<>)))
{
var list1 = (IList)sourceAccessor[member.Name];
var list2 = (IList)targetAccessor[member.Name];
if (list1.Count != list2.Count)
{
throw new ArgumentException("Lists need to be of the same length.");
}
for (var i = 0; i < list1.Count; ++i)
{
MirrorObject(list1[i], list2[i]);
}
}
else
{
targetAccessor[member.Name] = sourceAccessor[member.Name];
}
}
}https://stackoverflow.com/questions/58119041
复制相似问题