我想映射两个类实例之间匹配的所有属性。
public class Foo
{
public bool A { get: set: }
public bool B { get: set: }
public bool C { get: set: }
public bool D { get: set: }
public bool E { get: set: }
}
public class Bar
{
public bool A { get: set: }
public bool B { get: set: }
}
Bar bar = new Bar();
bar.A = true;
bar.B = true;
如何将bar
实例中的值映射到foo
的新实例(将属性“A”和“B”设置为true)?我尝试为它制作一个方法,但我得到异常Property set method not found.
。
public static void MapObjectPropertyValues(object e1, object e2)
{
foreach (var p in e1.GetType().GetProperties())
{
if (e2.GetType().GetProperty(p.Name) != null)
{
p.SetValue(e1, e2.GetType().GetProperty(p.Name).GetValue(e2, null), null);
}
}
}
非常感谢任何帮助,谢谢!
答案 0 :(得分:1)
我之前通过将公共属性抽象为接口,然后使用复制接口属性的实用程序类,实现了类似于此的东西。你最终得到的是这样的:
public interface IHaveAAndB
{
bool A { get; set; }
bool B { get; set; }
}
public class Foo : IHaveAAndB
{
public bool A { get; set; }
public bool B { get; set; }
public bool C { get; set; }
public bool D { get; set; }
public bool E { get; set; }
}
public class Bar : IHaveAAndB
{
public bool A { get; set; }
public bool B { get; set; }
}
// Disclaimer - I've not tested whether this compiles but essentially
// make the method generic and call it using the interface type
// and you can then do a copy from one set of properties to the other
// e.g. CopyInterfaceProperties<IHaveAAndB>(new Foo(), new Bar());
public static void CopyInterfaceProperties<T>(T e1, T e2)
{
foreach (var prop in typeof(T).GetProperties())
{
if (prop.CanRead && prop.CanWrite)
{
var value = prop.GetValue(e2, null)
prop.SetValue(e1, value, null);
}
}
}
在调用SetValue之前,请务必检查属性是否可以读取和写入!
如果您无法抽象到接口,只需在源上检查CanRead,在目标上检查CanWrite(同时检查目标上属性的存在)就可以解决上面的问题。
致以最诚挚的问候,