我有一个名为ItemChange<T>的类,它如下所示:

public class ItemChange<T> where T : MyBase
{
    public DateTime When { get; set; }
    public string Who { get; set; }
    public T NewState;
    public T OldState;
}

如您所见,它存储一个对象的两个副本(NewStateOldState)。我用这个来比较字段的变化。
我现在正试图让这个工作,我得到一个跨多个对象的更改列表,然后将一些不同类型的t列表连接到一个这样的数组中(注意:Object1Object2都是从MyBase派生的:
public IEnumerable<ItemChange<T>> GetChangeHistory<T>(int numberOfChanges) where T : MyBase
{
    IEnumerable<ItemChange<Object1>> obj1Changes= GetChanges<Object1>();
    IEnumerable<ItemChange<Object2>> obj1Changes= GetChanges<Object2>();
    return obj1Changes.Concat(obj2Changes).OrderByDescending(r => r.When).Take(numberofChanges);
}

如您所见,我需要连接来自多个类型的更改,但是我想获取最新的更改数(由numberOfChanges定义)
关于如何使下面的代码在concat行中工作的任何建议都会给我一个编译器错误(我想我必须以某种特殊的方式强制转换才能使它工作)。
有办法吗?

最佳答案

我建议在ItemChange<T>中添加一个名为ItemChange的基类。ItemChange可以声明when属性。然后很容易将列表内容转换为concat和order by的基ItemChange

using System;
using System.Collections.Generic;
using System.Linq;

namespace brosell
{

public class MyBase
{

}

public class ItemChange
{
    public DateTime When { get; set; }

}

public class ItemChange<T>: ItemChange where T : MyBase
{
    public string Who { get; set; }
    public T NewState;
    public T OldState;
}

public class Sub1: MyBase
{

}

public class Sub2: MyBase
{

}

   public class HelloWorld
   {
    public static void Main(string[] args)
    {
        List<ItemChange<Sub1>> listOfSub1 = new List<ItemChange<Sub1>>();
        List<ItemChange<Sub2>> listOfSub2 = new List<ItemChange<Sub2>>();

        var concated = listOfSub1.Cast<ItemChange>().Concat(listOfSub2.Cast<ItemChange>());

        var filtered = concated.OrderByDescending(ic => ic.When).Take(10);

        Console.WriteLine("{0}", filtered.Count());
        }
   }
}

09-11 20:48