最近,我遇到了在C#中比较同一类的两个对象的问题。我需要知道哪些字段/属性已更改。
以下是示例:
SampleClass
{
string sampleField1;
int sampleField2;
CustomClass sampleField3;
}
我有2个SampleClass
对象,object1
和object2
。
这两个对象具有一些不同的字段值。
有谁知道获得哪些字段不同的最佳方法?
如何获取不同字段/属性的(字符串)名称?
答案 0 :(得分:3)
如果您希望通用方式获取所有已更改的属性
您可以使用此方法(并使用反射^ _ ^)
public List<string> GetChangedProperties(object obj1, object obj2)
{
List<string> result = new List<string>();
if(obj1 == null || obj2 == null )
// just return empty result
return result;
if (obj1.GetType() != obj2.GetType())
throw new InvalidOperationException("Two objects should be from the same type");
Type objectType = obj1.GetType();
// check if the objects are primitive types
if (objectType.IsPrimitive || objectType == typeof(Decimal) || objectType == typeof(String) )
{
// here we shouldn't get properties because its just primitive :)
if (!object.Equals(obj1, obj2))
result.Add("Value");
return result;
}
var properties = objectType.GetProperties();
foreach (var property in properties)
{
if (!object.Equals(property.GetValue(obj1), property.GetValue(obj2)))
{
result.Add(property.Name);
}
}
return result;
}
请注意,此方法仅获取已更改的Primitive type properties和引用同一实例的引用类型属性
编辑:如果obj1
或obj2
是原始类型(int,string ...),则添加验证,因为我试图传递字符串对象,它会给出一个错误
还修复了检查这两个值是否为equal
答案 1 :(得分:2)
稍微修改了此处发布的另一个答案,但是此问题适用于非string
类型的属性,不使用内部列表并自动进行一些初步类型检查,因为它通用
public IEnumerable<string> ChangedFields<T>(T first, T second)
{
if (obj1.GetType() != obj2.GetType())
throw new ArgumentOutOfRangeException("Objects should be of the same type");
var properties = first
.GetType()
.GetProperties();
foreach (var property in properties)
{
if(!object.Equals(property.GetValue(first), property.GetValue(second)))
{
yield return property.Name;
}
}
}
答案 2 :(得分:2)