我正在使用反射来比较给定类的对象。我只想比较某些属性。现在,我有一个简单的字符串集合,其中包含要比较的属性的名称。
类似于:
public static readonly ICollection<string> PROPERTIES_TO_COMPARE = new List<string>()
{
"Name",
"Phone"
};
然后我用它做一些类似的事情:
PropertyInfo[] properties = typeof(MyClass).GetProperties();
foreach (PropertyInfo property in properties)
{
if (PROPERTIES_TO_COMPARE.Contains(property.Name))
{
//compare
}
}
但如果下个月我将房产名称从";电话";至";电话号码";我需要记住编辑属性集合。我觉得自己没有那么值得信赖。
有更好的方法吗?也许是类似于(variable(的名称,所以编译器可以帮助我吗?或者也许我的整个方法都错了?
更新:这就是我需要做的(理想情况下使用更少的代码(:
if (oldVersion.Name != newVersion.Name)
{
changes.Add(new Change()
{
FieldName = nameof(oldVersion.Name),
OldValue = oldVersion.Name,
NewValue = newVersion.Name
});
}
if (oldVersion.Phone != newVersion.Phone)
{
changes.Add(new Change()
{
FieldName = nameof(oldVersion.Phone),
OldValue = oldVersion.Phone,
NewValue = newVersion.Phone
});
}
// and 15 properties more
您可以使用nameof(MyClass.Name)
代替"Name"
,使用nameof(MyClass.Phone)
代替"Phone"
,这样就解决了重命名问题。然而,老实说,我会改为:
static bool ConsideredEqual(MyClass x, MyClass y)
=> x.Name == y.Name && x.Phone == y.Phone;
并使用该方法而不是所有的反射代码-完全相同的维护开销,但比反射快得多。