Как различать значения свойств двух объектов, используя GetType GetValue? - PullRequest
2 голосов
/ 08 января 2009

У меня есть следующие классы:

public class Person
{
    public String FirstName { set; get; }
    public String LastName { set; get; }
    public Role Role { set; get; }
}

public class Role
{
    public String Description { set; get; }
    public Double Salary { set; get; }
    public Boolean HasBonus { set; get; }
}

Я хочу иметь возможность автоматически извлекать различия значений свойств между Person1 и Person2, например, как показано ниже:

public static List<String> DiffObjectsProperties(T a, T b)
{
    List<String> differences = new List<String>();
    foreach (var p in a.GetType().GetProperties())
    {
        var v1 = p.GetValue(a, null);
        var v2 = b.GetType().GetProperty(p.Name).GetValue(b, null);

        /* What happens if property type is a class e.g. Role???
         * How do we extract property values of Role?
         * Need to come up a better way than using .Namespace != "System"
         */
        if (!v1.GetType()
            .Namespace
            .Equals("System", StringComparison.OrdinalIgnoreCase))
            continue;

        //add values to differences List
    }

    return differences;
}

Как мне извлечь значения свойств Role in Person ???

Ответы [ 3 ]

2 голосов
/ 08 января 2009
public static List<String> DiffObjectsProperties(object a, object b)
{
    Type type = a.GetType();
    List<String> differences = new List<String>();
    foreach (PropertyInfo p in type.GetProperties())
    {
        object aValue = p.GetValue(a, null);
        object bValue = p.GetValue(b, null);

        if (p.PropertyType.IsPrimitive || p.PropertyType == typeof(string))
        {
            if (!aValue.Equals(bValue))
                differences.Add(
                    String.Format("{0}:{1}!={2}",p.Name, aValue, bValue)
                );
        }
        else
            differences.AddRange(DiffObjectsProperties(aValue, bValue));
    }

    return differences;
}
1 голос
/ 08 января 2009

Если свойства не являются типами значений, почему бы просто не вызвать рекурсивный метод DiffObjectProperties и добавить результат в текущий список? Предположительно, вам нужно было бы пройтись по ним и добавить имя свойства в точечной нотации, чтобы вы могли увидеть, что отличается - или может быть достаточно знать, что если список не пуст, текущие свойства различаются .

0 голосов
/ 08 января 2009

Потому что я не знаю, как сказать, если:

var v1 = p.GetValue(a, null);

- это имя строки или роль. Я пытался выяснить, как определить, является ли v1 строкой, такой как FirstName или класс Role. Поэтому я не знаю, когда рекурсивно передавать свойство объекта (Role) обратно в DiffObjectsProperties для итерации значений его свойств.

...