using UnityEngine;
namespace TestFrame
{
public class GenericClass<T>
{
}
public class GenericClass<T, U> where T : Component
{
}
}
- Type.IsGenericType
返回类型是否是泛型,true泛型, false非泛型
- typeof(Type).FullName
typeof(TestFrame.GenericClass<>).FullName
返回
TestFrame.GenericClass`1
typeof(TestFrame.GenericClass<int>).FullName
返回
TestFrame.GenericClass`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
typeof(TestFrame.GenericClass<int, Camera>).FullName
返回
TestFrame.GenericClass`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[UnityEngine.Camera, UnityEngine.CoreModule, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]]
这一长串叫做AssemblyQualifiedName
。
- Type.GetType(string typeName)
Type.GetType("TestFrame.GenericClass`1[T]")
与Type.GetType("TestFrame.GenericClass`1")
都返回nullType.GetType("TestFrame.GenericClass`1[System.Int32]")
返回nullType.GetType("TestFrame.GenericClass`1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Assembly-CSharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
才能正确返回。括号中这一长串叫做AssemblyQualifiedName
。- 想要
Type.GetType("TestFrame.GenericClass`1[System.Int32]")
返回正确的结果怎么办呢,只能先找带类所在的Assembly
, 通过Assembly.GetType("TestFrame.GenericClass`1[System.Int32]")
才能返回正确的结果。Type.GetType("System.Int32")
为什么能正确返回呢,猜测应该是程序的当前Assemly能直接访问到,Assemly.FullName
为System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
,AssemblyQualifiedName
为System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Type.GetType("namespaceName.className, dllName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null")
与Type.GetType("namespaceName.className, dllName")
都能返回正确结果。namespaceName为命名空间名,className为类名,dllName为dll的名字。
-
Type.IsGenericTypeDefinition
Type.IsGenericTypeDefinition
指示当前Type是否表示可以用来构造其他泛型类型的泛型类型定义。
typeof(TestFrame.GenericClass<int>).IsGenericTypeDefinition()
返回falsetypeof(TestFrame.GenericClass<>).IsGenericTypeDefinition()
返回true
-
Type.GetGenericArguments() 与 Type.GetGenericParameterConstraints
先查看如下代码
- 先查看如下代码
private static void Print(Type type) { Type[] Arguments = type.GetGenericArguments(); foreach (Type tParam in Arguments) { if (tParam.IsGenericParameter) { Debug.Log(string.Format("{0} - parameter position {1})",tParam, tParam.GenericParameterPosition)); } if (tParam.ContainsGenericParameters) { Type[] constraints = tParam.GetGenericParameterConstraints(); foreach (Type con in constraints) { Debug.Log(string.Format("Constraint is {0}", con.Name)); } } } }
Print(TestFrame.GenericClass<,>)
输出
T - parameter position 0
U - parameter position 1
Constraint is Component
Print(TestFrame.GenericClass<int,Camera>)
没有输出
网友评论