【发布时间】:2021-07-16 18:38:49
【问题描述】:
我正在使用反射来比较给定类的对象。我只想比较某些属性。现在我有一个简单的字符串集合,其中包含我要比较的属性的名称。
类似:
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
}
}
但如果下个月我将属性名称从“Phone”更改为“PhoneNumber”,我将需要记住编辑属性集合。我不觉得自己那么值得信赖。
有没有更好的方法?也许类似于 nameof(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
【问题讨论】:
-
我的蜘蛛侠感觉很刺痛。我怀疑这是反射的一个很好的用途。您最好直接引用属性而不是通过反射。
-
如果你知道
myClass的类型,你为什么要使用反射?如果您不知道要比较的对象的类型的编译时知识,这将是有意义的... -
@Gelu "因为我是一个懒惰的混蛋" 那么你应该正确地这样做,因为它会减少未来的维护工作..
-
@Gelu
I need to compare 17 properties and list the changes在不使用反射的情况下,您能给我们举一个小例子,比如 3 个属性,它可以为您提供您期望或需要的输出吗?我们可以通过更多背景和实际示例提供更好的指导。 -
首先,你知道类型,因为你在做
typeof(MyClass)所以不知道为什么要使用反射。其次,如果您下周更改属性名称,则需要按您所说的更新集合,您可能会忘记。那是因为你做错了。如果您更改属性名称,请让编译器帮助您:可能会覆盖Equals方法并将所有相等的代码放在那里。如果您更改了属性名称,而忘记更新Equals方法,编译器会告诉您。顺便说一句,不要a lazy bastard;)
标签: c# .net reflection