Type 深入了解

2019-10-15  本文已影响0人  泱千澈
using UnityEngine;
namespace TestFrame
{
    public class GenericClass<T>
    {
    }

    public class GenericClass<T, U> where T : Component
    {
    }
}
  1. Type.IsGenericType

返回类型是否是泛型,true泛型, false非泛型

  1. 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
  1. Type.GetType(string typeName)
  • Type.GetType("TestFrame.GenericClass`1[T]")Type.GetType("TestFrame.GenericClass`1")
    都返回null
  • Type.GetType("TestFrame.GenericClass`1[System.Int32]")返回null
  • Type.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.FullNameSystem.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089AssemblyQualifiedNameSystem.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的名字。
  1. Type.IsGenericTypeDefinition
    Type.IsGenericTypeDefinition指示当前Type是否表示可以用来构造其他泛型类型的泛型类型定义。
  • typeof(TestFrame.GenericClass<int>).IsGenericTypeDefinition()返回false
  • typeof(TestFrame.GenericClass<>).IsGenericTypeDefinition()返回true
  1. 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>) 没有输出
参考

Type.IsGenericTypeDefinition Property

上一篇下一篇

猜你喜欢

热点阅读