Отображение значений между 2 объектами без использования внешних каркасов - PullRequest
1 голос
/ 16 января 2012

Я хочу отобразить все свойства, которые совпадают между двумя экземплярами класса.

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 Ответ

1 голос
/ 16 января 2012

Я реализовал нечто похожее на это раньше, абстрагируя общие свойства в интерфейсы, а затем имея служебный класс, который копировал свойства интерфейса.В итоге вы получите что-то вроде этого:

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 в месте назначения (также проверяя наличие свойства в месте назначения) должна решить проблему, возникшую выше.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...