如何编写一个通用方法来接收一个通用类型?

6
我想编写以下方法。
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>)

由于这样我会失去实际列表的类型信息,而这对我比列表内项目的类型更重要。

因此,上述想法应运而生,但却行不通。


我认为这是不可能的,因为List始终需要一个泛型参数。 - MutantNinjaCodeMonkey
1
我认为你无法设置这个约束。那么,将T作为一种通用类型,实现IInterface<T>接口,其中T派生自TItem,如何? - Wai Ha Lee
我并不真正理解Foo为什么需要以所描述的方式关联TTItem;你能给一个更具体的例子吗? - Codor
T是什么?只是集合类型还是其他东西?您能提供更多的示例,说明您想如何使用代码吗? - dotnetom
1
IList有一个Add方法。那个能用来代替吗? - MutantNinjaCodeMonkey
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Rand Random
3个回答

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

IEnumerable<TItem> ?? - Ehsan Sajjad
@EhsanSajjad 由于 ICollection<T> 实现了 IEnumerable<T>,因此您可以使用其中之一,具体取决于要求。 - dotnetom
这个解决方案似乎可行,但有点糟糕的是我必须指定泛型类型信息,也许有什么方法可以避免吗? - Rand Random
@RandRandom 很遗憾,我无法想到在这种情况下欺骗泛型的方法。 - dotnetom

1
也许这可以帮助你:
创建一个基类和派生类。
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..
    }
}

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# 的强类型系统。我们都会在某个时候这样做。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接