如何创建采用泛型类型的泛型方法

本文关键字:泛型类型 泛型方法 何创建 创建 | 更新日期: 2023-09-27 18:35:01

我想写下面的方法

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>)

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

所以上面的想法诞生了,但没有奏效。

如何创建采用泛型类型的泛型方法

由于您只需要集合,因此您可以描述如下方法:

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); 

也许这会有所帮助:

创建基类和派生类。

public class Item
{
}
public class Item<T> : Item
{
    T Value;
    public Item(T value)
    {
        Value = value;
    }
}

然后,您可以根据需要使用它:

public class SomewhereElse
{
    public void Main()
    {
        List<Item> itemCollection = new List<Item>();
        itemCollection.Add(new Item<int>(15));
        itemCollection.Add(new Item<string>("text"));
        itemCollection.Add(new Item<Type>(typeof(Image)));
        itemCollection.Add(new Item<Exception>(new StackOverflowException()));
        itemCollection.Add(new Item<FormWindowState>(FormWindowState.Maximized));
        // You get the point..
    }
}
在我看来

,你陷入了一个思维陷阱。可能有更好的方法来解决您要做的任何事情。

无论如何,请尝试使用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# 的强类型系统。我们都会在某个时候这样做。