是否可以对类属性的集合(或枚举)进行编码?

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)

以上是关于是否可以对类属性的集合(或枚举)进行编码?的主要内容,如果未能解决你的问题,请参考以下文章

对类(class)中的已有属性进行修改方法1

按特定属性对类列表进行排序[重复]

谨慎修改Python的类属性

python的类基础详解

如何判断是否已设置枚举属性? C#

我可以通过对类进行编码将分类问题转化为回归问题吗?