У меня есть следующие занятия:
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 ???





Если свойства не являются типами значений, почему бы просто не вызвать DiffObjectProperties рекурсивно для них и добавить результат в текущий список? Предположительно, вам нужно будет перебрать их и добавить имя свойства в точечной нотации, чтобы вы могли видеть, что отличается - или этого может быть достаточно, чтобы знать, что если список не пуст, текущие свойства отличаются .
Потому что я не знаю, как определить:
var v1 = p.GetValue(a, null);
- String FirstName или Role Role. Я пытался выяснить, как определить, является ли v1 строкой, такой как FirstName, или ролью класса. Поэтому я не знаю, когда рекурсивно передать свойство объекта (роль) обратно в DiffObjectsProperties для итерации значений его свойств.
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;
}
Поскольку вы передаете объекты вместо общего типа T, я думаю, вам нужно сделать следующее: if (a.GetType ()! = B.GetType ()) вернет различия;