2011-11-05 154 views

回答

6

編寫的方式是

Type generic = Type.GetType("System.Tuple`2"); 

一般類型的格式是簡單的:

"Namespace.ClassName`NumberOfArguments" 

`是字符96(ALT + 96)。

但是我會避免使用字符串,它比使用typeof或更好的數組查找更慢。 我會提供了一個很好的靜態函數是倍的速度千...

private static readonly Type[] generictupletypes = new Type[] 
{ 
    typeof(Tuple<>), 
    typeof(Tuple<,>), 
    typeof(Tuple<,,>), 
    typeof(Tuple<,,,>), 
    typeof(Tuple<,,,,>), 
    typeof(Tuple<,,,,,>), 
    typeof(Tuple<,,,,,,>), 
    typeof(Tuple<,,,,,,,>) 
}; 

public static Type GetGenericTupleType(int argumentsCount) 
{ 
    return generictupletypes[argumentsCount]; 
} 
+1

哈,我看到這是他們是如何在伊利諾斯州命名,當我的反思很瘋狂時,我很愚蠢,錯過了這個機會!謝謝! – Darkzaelus

+1

:)不,你不是愚蠢的,是違反直覺的,我同意你的看法。 –

+1

關於優化,你可能是對的。我目前正在編寫一個可以處理多個泛型類的編譯器,但爲常見類型提供查找表可能非常有用 – Darkzaelus

0

試試這個:

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Threading; 
using System.Reflection; 
using System.Reflection.Emit; 

public class MainClass 
{ 
    public static void Main() 
    { 
     PrintTypeParams(typeof(Tuple<int, double, string>)); 
    } 

    private static void PrintTypeParams(Type t) 
    { 
     Console.WriteLine("Type FullName: " + t.FullName); 
     Console.WriteLine("Number of arguments: " + t.GetGenericArguments().Length); 
     Console.WriteLine("List of arguments:"); 
     foreach (Type ty in t.GetGenericArguments()) 
     { 
      Console.WriteLine(ty.FullName); 
      if (ty.IsGenericParameter) 
      { 
       Console.WriteLine("Generic parameters:"); 
       Type[] constraints = ty.GetGenericParameterConstraints(); 
       foreach (Type c in constraints) 
       Console.WriteLine(c.FullName); 
      } 
     } 
    } 
} 

輸出:

Type FullName: System.Tuple`3[[System.Int32, mscorlib, Version=4.0.0.0, Culture= 
neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=4.0. 
0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, 
Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 
Number of arguments: 3 
List of arguments: 
System.Int32 
System.Double 
System.String