迭代通用参数

时间:2016-12-09 23:13:10

标签: c# loops generics iterator clr

我认为这在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()

...但是这会产生一个运行时类型对象的列表,这不是我正在寻找的。

2 个答案:

答案 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

how-do-i-use-reflection-to-call-a-generic-method