2
是否有可能在運行時得到具有可變數量類型參數的泛型類型?C#反射類型與可變數量的類型參數
也就是說,根據一個數字,我們可以得到這個元素數目的元組類型嗎?
Type type = Type.GetType("System.Tuple<,>");
是否有可能在運行時得到具有可變數量類型參數的泛型類型?C#反射類型與可變數量的類型參數
也就是說,根據一個數字,我們可以得到這個元素數目的元組類型嗎?
Type type = Type.GetType("System.Tuple<,>");
編寫的方式是
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];
}
試試這個:
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
哈,我看到這是他們是如何在伊利諾斯州命名,當我的反思很瘋狂時,我很愚蠢,錯過了這個機會!謝謝! – Darkzaelus
:)不,你不是愚蠢的,是違反直覺的,我同意你的看法。 –
關於優化,你可能是對的。我目前正在編寫一個可以處理多個泛型類的編譯器,但爲常見類型提供查找表可能非常有用 – Darkzaelus