2

我正在尝试创建一个像这样的可重用方法

    public static void Order<T> (List<T> filteredList, List<T> fullList)
    {
        //Getting list of ID from all business entities.
        HashSet<long> ids = new HashSet<long>(filteredList.Select(x => x.ID));
        //Ordering the list
        return fullList.OrderByDescending(x => ids.Contains(x.ID)).ThenBy(x => !ids.Contains(x.ID)).ToList();
    }

因为我有多个对象做同样的事情,但它们是不同的集合类型。但显然问题出在 x.ID 上,因为 ID 是来自业务实体的属性。我是说。想象一下,T 是 Person,ID 是属性。但是 ID 无法从通用列表中识别出来,我想做通用的,因为我所有的业务实体都有 ID(人员、员工等)。

请问有什么帮助吗?

提前致谢。

4

2 回答 2

3

您可以在本例中创建一个InterfaceIBusinessEntity ,声明该项目必须具有如下 ID:

public interface IBusinessEntity
{
    public int ID { get; set; }
}

因此,您的PersonEmployee课程将更改为:

public class Person : IBusinessEntity
{
    public int ID { get; set; }
    // ...
}

public class Employee : IBusinessEntity
{
    public int ID { get; set; }
    // ...
}

然后您将只允许像这样传入业务实体(在此示例中Person和):Employee

public static void Order<IBusinessEntity> (List<IBusinessEntity> filteredList, List<IBusinessEntity> fullList)
{
    //Getting list of ID from all business entities.
    HashSet<long> ids = new HashSet<long>(filteredList.Select(x => x.ID));
    //Ordering the list
    return fullList.OrderByDescending(x => ids.Contains(x.ID)).ThenBy(x => !ids.Contains(x.ID)).ToList();
}

这当然也允许您创建模拟IBusinessEntity和单元测试这个方法。

于 2013-06-28T15:35:32.390 回答
0

感谢您的快速答复。我真的很感激。好吧,我看到了您的代码,我认为这很棒!我做了一个小应用程序来测试它,它有一些变化,因为接口不允许我定义公共属性,并且 Order 中的类型向我显示了 IBusinessEntity 类型的冲突,所以我将它声明为 Order T,这很棒。最后这是最后的结果。

public interface IEntity
{
    int id { get; set; }
}

public class Person: IEntity
{
    public int id { get; set; }
}

public class Employee : IEntity
{
    public int id { get; set; }
}

    public static List<IEntity> Order<T>(List<IEntity> filtered, List<IEntity> full)
    {
        HashSet<int> ids = new HashSet<int>(filtered.Select(x => x.id));
        return full.OrderByDescending(x => ids.Contains(x.id)).ThenBy(x => !ids.Contains(x.id)).ToList();
    }

谢谢你。

于 2013-06-29T19:11:16.993 回答