我认为这在C#中是不可能的,但有没有办法迭代一般参数列表?像这样:
public class Test<T, T1, T2, T3, T4>
{
public void DoIt()
{
foreach (var TItem in [T, T1, T2, T3, T4])
{
var foo = SomeService.Get<TItem>();
/* or */
var bar = new List<TItem>();
}
}
}
很明白,由于CLR限制,答案是否定的,但想知道是否有任何方法可以实现这一点。我知道你可以这样做:
this.GetType().GetGenericArguments()
...但是这会产生一个运行时类型对象的列表,这不是我正在寻找的。 p>
答案 0 :(得分:1)
我倾向于同意@Kyle在这里的评论(这不是那么有价值,因为它主要只是保存打字)。
话虽如此,这可能不是您正在寻找的,但是对于这个代码示例的价值可能很有趣:
private static void DisplayGenericTypes<T, Q, R, S>()
{
// The output of DisplayGenericTypes<int, string, double, float>(); is int, string, double, float
foreach (Type t in new[] { typeof(T), typeof(Q), typeof(R), typeof(S)})
{
Console.WriteLine(t.Name);
}
Type[] generics = MethodInfo.GetCurrentMethod().GetGenericArguments();
// Output is T, Q, R, S
foreach (Type t in generics)
{
Console.WriteLine(t.Name);
}
}
答案 1 :(得分:0)
using System;
using System.Reflection;
public class Program
{
public static void Main()
{
var instance = new Test<string, string, string, string, string>();
instance.DoIt();
}
}
public class Test<T, T1, T2, T3, T4>
{
public void DoItAgain<T5>()
{
Console.WriteLine(typeof(T5));
}
public void DoIt()
{
Type[] genericTypes = this.GetType().GetGenericArguments();
foreach (var TItem in genericTypes)
{
Console.WriteLine(TItem);
//Instead of
// var foo = SomeService.Get<TItem>();
//Call generic method like this
MethodInfo method = this.GetType().GetMethod("DoItAgain");
MethodInfo generic = method.MakeGenericMethod(TItem);
generic.Invoke(this, null);
}
}
}
不确定您要完成的任务。但这很有效。
whats-the-difference-between-system-type-and-system-runtimetype-in-c