【发布时间】:2019-06-10 09:42:51
【问题描述】:
我需要按相同的值对多个列表进行排序。但是,无论出于何种原因,这些列表包含共享此值的不同类型的对象。我们称之为 ChildID。
简化的模型代码如下所示:
public class Child
{
public string ChildID { get; set; }
}
public class Parent
{
public Child Child { get; set; }
}
public class OtherClassID
{
public int ID { get; set; }
public string ChildID { get; set; }
}
public class SomeOtherClass
{
public OtherClassID ID { get; set; }
}
所以,为了避免代码重复,我尝试了这个:
public interface IHasChildID
{
string GetChildID();
}
public class Child : IHasChildID
{
public string ChildID { get; set; }
public string GetChildID()
{
return ChildID;
}
}
public class Parent : IHasChildID
{
public Child Child { get; set; }
public string GetChildID()
{
return Child.ChildID;
}
}
public class OtherClassID
{
public int ID { get; set; }
public string ChildID { get; set; }
}
public class SomeOtherClass : IHasChildID
{
public OtherClassID ID { get; set; }
public string GetChildID()
{
return ID.ChildID;
}
}
当我用一个以接口作为参数的辅助方法创建一个辅助类时,我希望它可以工作:
public static class ChildOrderHelper
{
public static IEnumerable<IHasChildID> OrderChildren(IEnumerable<IHasChildID> children)
{
var childrenList = children.ToList();
//do some splitting, ordering and conatenation of lists
return orderedList;
}
}
但是,在每次帮助调用时,我都会收到一个错误:
List<Child> originalList = GetChildren(); // whatever
// some lines of code
var orderedList = ChildOrderHelper.OrderChildren(originalList).ToList(); // error
错误 CS1503 参数 1:无法从 'System.Collections.Generic.List
' 到 'System.Collections.Generic.List '
因此对于每个帮助器调用,无论类型如何。
需要注意的一点是,我给出了一个示例,其中包含三种不同类型,它们具有此值并需要按其排序。在项目中,大概有10个或更多。
我想我对接口的使用有些基本的了解,但在这件事上任何帮助都将不胜感激。
【问题讨论】:
-
你传入的“originalList”是什么样的?
-
@Nick 这只是要订购的
Child对象的列表。我也会将其添加到问题中。 -
你的代码对我来说编译得很好——你运行的是 .Net 4.0 之前的版本(不支持接口变化)?
-
@JonasHøgh 不,4.6.1 是目标框架。
-
没有办法解决这个问题。如果您的排序操作在所有 IHasChildID 中都是通用的,则无法知道原始输入是 child 类型。除非您的列表很大,否则我不会担心演员表对性能的影响。