美文网首页
Type 深入了解

Type 深入了解

作者: 泱千澈 | 来源:发表于2019-10-15 18:11 被阅读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

    相关文章

      网友评论

          本文标题:Type 深入了解

          本文链接:https://www.haomeiwen.com/subject/tozsyctx.html