【发布时间】:2013-08-04 16:38:32
【问题描述】:
我需要写一堆接受1..N个泛型类型参数的方法,例如:
int Foo<T1>();
int Foo<T1,T2>();
int Foo<T1,T2,T3>();
...
int Foo<T1,T2,T3...TN>();
在Foo()里面我想为每种类型做一些事情,例如
int Foo<T1,T2,T3>() {
this.data = new byte[3]; // allocate 1 array slot per type
}
有什么方法可以参数化它,这样我就不会编辑Foo() 的每个变体,类似于:
int Foo<T1,T2,T3>() {
this.data = new byte[_NUMBER_OF_GENERIC_PARAMETERS];
}
理想情况下,我还希望能够获得类型的数组或集合:
int Foo<T1,T2,T3>() {
this.data = new byte[_NUMBER_OF_GENERIC_PARAMETERS];
// can do this
Type [] types = new Type[] { T1, T2, T3 };
// but would rather do this
Type [] types = _ARRAY_OR_COLLECTION_OF_THE_GENERIC_PARAMETERS;
}
【问题讨论】:
-
在 C# 类型系统的上下文中,拥有可变参数泛型参数列表实际上没有任何意义——您将如何在其签名中使用这些类型创建一个方法?如果你从不在方法签名中使用类型参数,那么直接使用
Types 的集合会更合适。 (除非您尝试捕获可变参数列表的编译时类型,但这也没有任何意义 -params列表是一个预定类型的数组。) -
看看这个,stackoverflow.com/questions/44153/…,但是我怀疑这比它的价值更麻烦。
-
看看 Jon Skeet 在stackoverflow.com/questions/213333/… 的回答。您可以根据需要使用 params 关键字。