是否可以对类属性的集合(或枚举)进行编码?
Posted
技术标签:
【中文标题】是否可以对类属性的集合(或枚举)进行编码?【英文标题】:Iis it possible to codify a collection (or enumeration) of class properties? 【发布时间】: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
;)
【参考方案1】:
你可以用nameof(MyClass.Name)
代替"Name"
,用nameof(MyClass.Phone)
代替"Phone"
,这样就解决了重命名问题。但是,老实说,我会这样做:
static bool ConsideredEqual(MyClass x, MyClass y)
=> x.Name == y.Name && x.Phone == y.Phone;
并使用该方法而不是所有反射代码 - 完全相同的维护开销,但比反射快得多。
【讨论】:
nameof(MyClass.Phone)以上是关于是否可以对类属性的集合(或枚举)进行编码?的主要内容,如果未能解决你的问题,请参考以下文章