在不使用外部框架的情况下映射2个对象之间的值

时间:2012-01-16 15:20:57

标签: c# asp.net mapping

我想映射两个类实例之间匹配的所有属性。

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);
            }   

        }
    }

非常感谢任何帮助,谢谢!

1 个答案:

答案 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(同时检查目标上属性的存在)就可以解决上面的问题。

致以最诚挚的问候,