比较 C# 中派生对象的列表

问题描述

我是 C# 的新手。所以请耐心等待。当我尝试比较两个不同派生对象的列表时遇到了问题。我有一个基类和一个继承自它的子类。派生类在 Equals() 值比较中具有附加属性。我在bass类和派生类中实现了IEquatable接口。然后我填充两个列表,每个列表都有一个来自派生类的对象。问题是当我调用 Equals() 函数时,调用的是 Base.Equals()。所以基本上列表中的项目被视为基类对象而不是派生对象。我该如何摆脱这种情况?见下面的代码:

public class Base : IEquatable<Base>
{
    ... 
    public int BaseProperty {get; set;}
    ...
    public virtual bool Equals(Base other)
   {
      ...
      return this.BaseProperty == other.BaseProperty;
   }
}

public class Derived : Base,IEquatable<Derived>
{
   public int DerivedProperty {get; set:}
   ...
   
}

public class myList : IList<Base>,IEquatable<myList>
{
   private List<Base> _list;
   ...

   public bool Equals(myList other)
   {
      ...
      return ENumerable.SequenceEqual(this._list.OrderBy(r => r),other._list.OrderBy(r = > r));
   }
}

Main()
{
    Derived first = new Derived() {...};
    Derived second = new Derived() {...};
    myList<Derived> list1 = new List<Derived>(){ first };
    myList<Derived> list2 = new List<Derived>(){ second };

    bool ret = list1.Equals(list2);
}

两个列表的比较是使用 SequenceEqual 完成的。当我进入调用时,我可以看到跟踪以 Base.Equals(Base other) 而不是 Derived.Equals(Derived other) 结束。我无法转换它,因为实际上我有多个派生类,并且列表可能包含任何数量的任何对象。所以我的问题是有没有办法让 C# 在这种情况下尊重派生类型?谢谢。

解决方法

尝试回答您的终极问题 -

所以我的问题是有没有办法让 C# 在这种情况下尊重派生类型?谢谢。

调用 Base.Equals 方法(而不是 Derived.Equals 方法)的原因是因为您声明的 'myList' 实际上定义了 Base 类 -

useMutation(
  values => createGroup(values),{
    onMutate: async value => {
      await queryClient.cancelQueries('groups')
 
      const previousGroups = queryClient.getQueryData('groups')
 
      queryClient.setQueryData('groups',old => [...old,value])
 
      return { previousGroups }
    },onError: (err,values,context) => {
      queryClient.setQueryData('groups',context.previousGroups)
    },onSettled: () => {
      queryClient.invalidateQueries('groups')
    }
  }
)

相反,如果您以通用方式实现 myList,则在使用 Derived 类创建 myList 对象时不会隐式转换为 Base -

onSuccess

我已尽最大努力在以下链接上为您实现一个示例(尽管继承自泛型而不是它们的接口),以尝试向您展示它的工作原理。它确实与您上面的内容略有不同,但它有望回答问题。

https://dotnetfiddle.net/VhWTCq

希望有所帮助 - 复制它,逐步完成,然后试一试。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...