如何制作采用泛型类型的泛型方法

时间:2016-02-17 18:38:48

标签: c# generics

我想写下面的方法

private void Foo<T, TItem>(T<TItem> param1)

其中T必须是以TItem作为其通用信息的泛型类型。

调用示例如下:

private void Main()
{
    List<int> ints = new List<int>();
    Foo<List, int>(ints);    
}

修改 就我而言,我只需要收藏。 实际的用例是我想编写一个方法,向ICollection添加一些东西,遗憾的是ICollection没有.Add方法只有ICollection<T>有它。

我无法将方法更改为:

private Foo<T>(ICollection<T>)

因为我失去了信息实际列表的类型,这对我来说比列表中的项目类型更重要。

所以上述想法诞生了,但没有用。

3 个答案:

答案 0 :(得分:7)

由于您只需要集合,您可以描述这样的方法:

private void Foo<T, TItem>(T param1)
    where T: ICollection<TItem>
{
}

但是,在这种情况下,您需要提供特定的通用类型(List<int>)作为第一个通用参数,您不能仅使用List

List<int> ints = new List<int>();
Foo<List<int>, int>(ints); 

答案 1 :(得分:1)

也许这会有所帮助:

创建基类和派生类。

cd desktop 
cd agario-feeder-bot-master 
node feeder.js

然后您可以按照以下方式使用它:

public class Item
{

}

public class Item<T> : Item
{
    T Value;

    public Item(T value)
    {
        Value = value;
    }
}

答案 2 :(得分:0)

对我而言,就像你陷入了一个心灵陷阱。可能有更好的方法来解决你想做的事情。

无论如何,请尝试使用Dictionary。你不需要真正写一个方法。

int number = 15;
double dub = 15.5;
Button button = new Button();

Dictionary<object, Type> typeGlossary = new Dictionary<object, Type>();
typeGlossary.Add(number, typeof(int));
typeGlossary.Add(dub, typeof(double));
typeGlossary.Add(button, typeof(Button));

最终,你的前瞻性代码注入的大脑将放弃尝试强化强类型的C#系统。我们都会在某些时候这样做。