Как выбрать свойства из разных классов и присвоить им значение - PullRequest
0 голосов
/ 30 ноября 2018

У меня есть два класса с разными свойствами в каждом классе.Если для свойств в myClass1 задано нулевое значение, как я могу сопоставить их со свойствами в myClass2 и установить для них также нулевое значение?Я пытался использовать отражение, но не могу заставить его работать.Проблема с тем способом, который у меня есть ниже, заключается в том, что при циклическом просмотре свойств свойства не совпадают с правами другого класса.У меня есть фрагмент моего кода ниже.

public class MyClass1
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int Age { get; set; }
    public int NumberOfFamilyMembers { get; set; }
    public int Birthdate { get; set; }
}


public class MyClass2
{
    public string FirstName { get; set; }
    public string MiddleName {get; set; }
    public string LastName { get; set; }
    public int Birthdate { get; set; }
    public string BirthLocation { get; set; }
}

public Overwrite(MyClass1 myclass1, MyClass2, myclass2)
{
    var props1 = from prop in typeof(myClass1).GetProperties()
                where prop.PropertyType == type(string)
                select prop;

    var props2 = from prop in typeof(myClass2).GetProperties()
                where prop.PropertyType == type(string)
                select prop;

    foreach (var property1 in props1)
    {
        foreach (var property2 in props2)
        {
            if(property1.GetValue(myClass1, null) == null)
            {
               property2.SetValue(this, string.Empty, null);
            }
        }
    }
}

1 Ответ

0 голосов
/ 30 ноября 2018

Правильный способ сделать это так:

static void Overwrite(MyClass1 o1, MyClass2 o2)
{
    o2.FirstName = o1.FirstName;
    o2.LastName = o1.LastName;
    o2.Birthdate = o1.Birthdate;
}

Я не видел ни одного случая использования Reflection в этом сценарии.

Если вы настаиваете на том, чтобы сделать это с помощью Reflection (не рекомендуется), это должно быть сделано:

static void OverwriteWithReflection(MyClass1 o1, MyClass2 o2)
{
    var targetType = o2.GetType();

    foreach (var fromProperty in o1.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
    {
        if (!fromProperty.CanRead) continue; //Source property is write-only
        var toProperty = targetType.GetProperty(fromProperty.Name, BindingFlags.Instance | BindingFlags.Public);
        if (toProperty == null) continue; //No matching property
        if (!toProperty.CanWrite) continue; //Target is read only
        if (toProperty.PropertyType != fromProperty.PropertyType) continue; //Properties aren't the same type
        toProperty.SetValue(o2, fromProperty.GetValue(o1, null));
    }
}

Нажмите здесь, чтобы увидеть пример рабочего кода на DotNetFiddle

...