Generics 通用列表的.NET通用参数

Generics 通用列表的.NET通用参数,generics,.net-2.0,Generics,.net 2.0,运行.NET 2.0时,我有一个具有以下签名的通用方法: static listType FillCollection<listType, objType>(IDataReader dr) where listType : ICollection<objType>, new() 静态listType FillCollection(IDataReader dr),其中listType:ICollection,new() 它的目的是将datareader转换为我选择的对象

运行.NET 2.0时,我有一个具有以下签名的通用方法:

static listType FillCollection<listType, objType>(IDataReader dr) where listType : ICollection<objType>, new()
静态listType FillCollection(IDataReader dr),其中listType:ICollection,new() 它的目的是将datareader转换为我选择的对象集合。我的问题并不完全是个问题,当我打电话给它时,电话结果是这样的:

List<MyObject> data = FillCollection<List<MyObject>, MyObject>(dr);
List data=FillCollection(dr);
我很好奇是否有办法消除调用中两次指定MyObject所带来的冗余。理想情况下,我只能指定一次,以及集合类型,并保持方法的强类型性质。添加另一个包装器方法来抽象ICollection类型sorta可以实现以下目的:

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

static List<objType> FillList<objType>(dr)
{
    return FillCollection<List<objType>, objType>(dr);
}
列表数据=填充列表(dr);
静态列表填充列表(dr)
{
退货回收(dr);
}
但是我不希望对我想要使用的每个集合都有一个包装器方法

也许在这件事上我别无选择,但如果是这样,我就不必喜欢它了!;)


谢谢

如果使用VisualStudio2008,您仍然可以将.NET2.0作为目标,但要使用C#3.0语法。这意味着您可以使用“var”关键字:

var数据=FillCollection(dr);

当您使用Visual Studio 2005时,恐怕您运气不好。

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

var数据=FillCollection(dr);

当您使用Visual Studio 2005时,恐怕您运气不好。

您可以使用var吗?

您可以使用var吗?

这可能是值得尝试的:

static listType FillCollection<objType>(IDataReader dr, ICollection<objType> list)
静态列表类型FillCollection(IDataReader dr,ICollection列表)
这将允许您在不指定两次类型的情况下调用它,但您将被迫在FillCollection之外创建集合

var list = new List<MyObject>();
var data = FillCollection<MyObject>(dr, list);
var list=newlist();
var数据=数据收集(dr,列表);

可能不是您所希望的,因为您仍然两次引用MyObject(一次是在创建列表时,另一次是在FillCollection中),但我不认为您能够在不丢失强输入的情况下摆脱它。

这可能是值得尝试的:

static listType FillCollection<objType>(IDataReader dr, ICollection<objType> list)
静态列表类型FillCollection(IDataReader dr,ICollection列表)
这将允许您在不指定两次类型的情况下调用它,但您将被迫在FillCollection之外创建集合

var list = new List<MyObject>();
var data = FillCollection<MyObject>(dr, list);
var list=newlist();
var数据=数据收集(dr,列表);

可能不是你所希望的,因为你仍然两次引用MyObject(一次是在创建列表时,另一次是在FillCollection中),但我认为你不可能在不丢失强输入的情况下摆脱它。

就个人而言,我不太清楚为什么您需要您的方法来创建多个不同的ICollection实现。我倾向于有一个方法签名,如下所示,在方法内部创建一个列表并返回它

static ICollection<T> FillCollection<T>(IDataReader dr) where T : class, new()
静态ICollection FillCollection(IDataReader dr),其中T:class,new()

如果这是不可接受的,那么我会同意Joseph的回答。

就我个人而言,我不太清楚为什么您需要您的方法来创建多个不同的ICollection实现。我倾向于有一个方法签名,如下所示,在方法内部创建一个列表并返回它

static ICollection<T> FillCollection<T>(IDataReader dr) where T : class, new()
静态ICollection FillCollection(IDataReader dr),其中T:class,new()

如果这是不可接受的,那么我会同意Joseph的回答。

有点偏离Joseph所提到的,我过去使用过“out”参数,效果很好,但从来没有一个泛型类型依赖另一个泛型类型而不获取或返回该类型的值。无论如何,您可以这样做,尽管您必须在对FillCollection的调用之外声明一个objType列表和一个objType对象,FillCollection将变得无效。下面是它的外观,但增加可读性是否是一个好主意取决于您

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);
}
公共静态void FillCollection(IDataReader dr、out listType集合、out objType obj)
其中listType:ICollection,new()
其中objType:new()
{
集合=新的listType();
obj=新的objType();
//尽你所能填满这个收藏
}
公共静态void TestFillCollection()
{
伊达瑞德博士;
列出我的对象;
肌体肌体;
FillCollection(dr,out myObjects,out myObject);
}

类似于Joseph提到的,我在过去使用了“out”参数并取得了良好的效果,但从未使用一个泛型类型依赖另一个泛型类型而不获取或返回该类型的值。无论如何,您可以这样做,尽管您必须在对FillCollection的调用之外声明一个objType列表和一个objType对象,FillCollection将变得无效。下面是它的外观,但增加可读性是否是一个好主意取决于您

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);
}
公共静态void FillCollection(IDataReader dr、out listType集合、out objType obj)
其中listType:ICollection,new()
其中objType:new()
{
集合=新的listType();
obj=新的objType();
//尽你所能填满这个收藏
}
公共静态void TestFillCollection()
{
伊达瑞德博士;
列出我的对象;
肌体肌体;
FillCollection(dr,out myObjects,out myObject);
}

我认为他希望避免在方法调用中两次指定MyObject,就像您现在仍然在做的那样。我可能错了。嗯。。。我不是那样读的。但只有一个人能帮我们。韦斯?你什么意思?拉西是对的,这正是我想要避免的。但是我仍然在VS2005上,所以没有变量。我想他希望避免在方法调用中两次指定MyObject,就像您现在仍然在做的那样。