这是类结构:
public class PriorityItem
public class GenePriorityItem : PriorityItem
public class DrugPriorityItem : PriorityItem
public class VariantPriorityItem : PriorityItem
我想实现一个方法,可以按照它们的共同属性(PriorityItem
有~10个属性)对任何这些项的列表进行排序。
我试过了:
protected IEnumerable<PriorityItem> SortResults(string expression, SortDirection direction, IEnumerable<PriorityItem> results)
我决定使用IEnumerable
而不是List
的原因是因为我可以施放:
var list = new List<VariantPriorityItem>()
SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
但我不能这样做:
SortResults(expression, direction, (List<PriorityItem>)list)
然而,所有这些对我没有任何好处,因为我无法将结果分配回List
:
list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
编译器告诉我它不能抛弃继承树(这是有道理的)。
我该如何解决这个问题?我真的不想为每个类编写4个方法。
答案 0 :(得分:2)
将方法声明为带约束的通用
protected IEnumerable<P> SortResults<P>
(string expression, SortDirection direction, IEnumerable<P> results)
where P: PriorityItem
然后按如下方式调用sort
list = SortResults(expression, direction, list).ToList()
答案 1 :(得分:0)
您可以使用.OfType&lt; T>和.ToList()运算符:
list = SortResults(expression, direction, (IEnumerable<PriorityItem>)list)
.OfType<VariantPriorityItem>()
.ToList();
答案 2 :(得分:0)
这样的事情在一个小小的测试中似乎对我有用:
using System.Collections.Generic;
using System.Linq;
namespace SortTest
{
class Program
{
public static IEnumerable<T> Sort<T>(IEnumerable<T> list) where T : BaseType
{
return list.OrderByDescending(a => a.SortOrder);
}
static void Main(string[] args)
{
List<Type1> theList = new List<Type1>();
for (int i = 0; i < 10; i++)
{
theList.Add(new Type1() { SortOrder = i });
}
theList = Sort(theList).ToList();
}
}
public class BaseType { public int SortOrder { get; set; } }
public class Type1 : BaseType { }
}