通用列表的.NET通用参数

时间:2009-06-02 16:03:54

标签: generics .net-2.0

运行.NET 2.0,我有一个带有以下签名的泛型方法:

static listType FillCollection<listType, objType>(IDataReader dr) where listType : ICollection<objType>, new()

它的目的是将datareader转换为我选择的对象集合。我的问题,这不是一个问题,就是当我打电话给它时,电话会看起来像这样:

List<MyObject> data = FillCollection<List<MyObject>, MyObject>(dr);

我很好奇是否有办法减少必须在通话中指定MyObject两次的冗余。理想情况下,我只能指定一次,连同收集键入并保持方法的强类型性质。添加另一个包装器方法来抽象ICollection类型sorta可以解决这个问题:

List<MyObject> data = FillList<MyObject>(dr);

static List<objType> FillList<objType>(dr)
{
    return FillCollection<List<objType>, objType>(dr);
}

但我宁愿没有我想要使用的每个集合的包装方法。

也许我没有选择,但如果是这样,我不必喜欢它! ;)

谢谢!

5 个答案:

答案 0 :(得分:2)

这可能是值得尝试的事情:

static listType FillCollection<objType>(IDataReader dr, ICollection<objType> list)

这样可以在不指定类型两次的情况下调用它,但是您将被迫在FillCollection之外创建集合。

var list = new List<MyObject>();
var data = FillCollection<MyObject>(dr, list);

可能不是你所希望的,因为你仍然两次引用MyObject(一次创建List,另一次在FillCollection中),但我不认为你能够远离那个不失强势打字。

答案 1 :(得分:1)

如果使用Visual Studio 2008,仍然可以使用.NET 2.0,但使用C#3.0语法。这意味着您可以使用“var”关键字:

var data = FillCollection<List<MyObject>, MyObject>(dr);

当你使用Visual Studio 2005时,我很害怕你好运。

答案 2 :(得分:1)

你能使用var吗?

答案 3 :(得分:1)

就个人而言,我不确定为什么你需要你的方法来创建ICollection的多个不同实现。我倾向于有一个方法签名,如下所示,只需在方法中创建一个List并返回它。

static ICollection<T> FillCollection<T>(IDataReader dr) where T : class, new()

如果那是不可接受的,那么我会选择约瑟夫的回答。

答案 4 :(得分:1)

从约瑟夫所提到的内容来看,我过去曾使用“out”参数并获得了良好的结果,但是从未使用过一种类型依赖于另一种类型而不取得或返回该类型的值。无论如何,你可以做这样的事情,虽然你必须有一个objTypes列表和一个在FillCollection调用之外声明的objType对象,并且FillCollection将变为void。这就是它的样子,但是否提高可读性是一个好主意取决于你。

public static void FillCollection<listType, objType>(IDataReader dr, out listType collection, out objType obj) 
    where listType : ICollection<objType>, new() 
    where objType : new()
{
    collection = new listType();
    obj = new objType();

    // Do whatever you do to fill the collection
}

public static void TestFillCollection()
{
    IDataReader dr;
    List<MyObject> myObjects;
    MyObject myObject;

    FillCollection(dr, out myObjects, out myObject);
}