如何解决比较 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
希望有所帮助 - 复制它,逐步完成,然后试一试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。