2016-12-09 7 views
0

これは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() 

...しかし、それは私が探しているものではありませんランタイムTypeオブジェクトのリストを生成する:私はあなたが行うことができます知っています。

+0

なぜ?あなたは実際に何をしようとしていますか? – SimpleVar

+0

http://stackoverflow.com/questions/41029481/c-sharp-fluent-api-with-dynamic-func-construction –

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

関連する問題