1.反射知识小补充

1.必备知识点-反射知识小补充


1.1 知识点

反射知识回顾

反射3剑客—— 1T 两 A

  • Type —— 用于获取类的所有信息,包括字段、属性、方法等等
  • Assembly —— 用于获取程序集,通过程序集获取Type
  • Activator —— 用于快速实例化对象

Type.IsAssignableFrom方法 判断能否父类装子类

Type 类中的 IsAssignableFrom 方法用于确定一个类型是否可以从另一个类型赋值。它返回一个布尔值,指示调用类型是否可以从指定的类型派生或分配。

这个方法通常用于反射和类型比较的场景中。例如,你可以使用 IsAssignableFrom 来检查一个对象是否可以转换为另一个类型,或者确定一个类型是否是另一个类型的子类或接口的实现类。

Type fatherType = typeof(Father);
Type sonType = typeof(Son);

// 确定指定类型 sonType 的实例是否能分配给当前类型的变量。
if (fatherType.IsAssignableFrom(sonType))
{
    print("可以装");
    Father f = Activator.CreateInstance(sonType) as Father;
    print(f);
}
else
{
    print("不能装");
}

Type.GetGenericArguments方法 获取表示泛型类型参数的 Type 对象数组

Type 类中的 GetGenericArguments 方法用于获取表示泛型类型参数的 Type 对象数组。这个方法通常用于处理泛型类型,其中一个类型可能包含一个或多个类型参数。

该方法返回一个 Type 数组,其中包含表示泛型类型参数的 Type 对象。

// 获得List的Type类
List<int> list = new List<int>();
Type listType = list.GetType();
// 获得List泛型参数数组的Type
Type[] types = listType.GetGenericArguments();
print(types[0]); // System.Int32

// 获得Dictionary的Type类
Dictionary<string, float> dic = new Dictionary<string, float>();
Type dicType = dic.GetType();
// 获得Dictionary泛型参数数组的Type
types = dicType.GetGenericArguments();
print(types[0]); // System.String
print(types[1]); // System.Single

1.2 知识点代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Father
{

}

public class Son : Father
{

}

public class Lesson01_必备知识点_反射知识小补充 : MonoBehaviour
{
    void Start()
    {
        #region 知识点一 反射知识回顾

        //反射3剑客—— 1T 两 A
        //Type —— 用于获取 类的所有信息 字段 属性 方法 等等
        //Assembly —— 用于获取程序集 通过程序集获取Type
        //Activator —— 用于快速实例化对象

        #endregion

        #region 知识点二 判断一个类型的对象是否可以让另一个类型为自己分配空间

        //父类装子类 是否可以从某一个类型的对象 为自己 分配 空间

        //获得父类和子类的Type
        Type fatherType = typeof(Father);
        Type sonType = typeof(Son);

        //IsAssignableFrom方法 调用者 通过该方法进行判断 判断是否可以通过传入的类型为自己 分配空间
        //确定指定类型 c 的实例是否能分配给当前类型的变量。
        if (fatherType.IsAssignableFrom(sonType))
        {
            print("可以装");
            Father f = Activator.CreateInstance(sonType) as Father;
            print(f);
        }
        else
        {
            print("不能装");
        }

        #endregion

        #region 知识点三 通过反射获取泛型类型

        //GetGenericArguments方法 返回泛型参数数组的Type
        //返回表示封闭式泛型类型的类型参数或泛型类型定义的类型参数的 Type 对象的数组。
        //获得List的Type类
        List<int> list = new List<int>();
        Type listType = list.GetType();
        //获得List泛型参数数组的Type
        Type[] types = listType.GetGenericArguments();
        print(types[0]);//System.Int32
        //获得Dictionary的Type类
        Dictionary<string, float> dic = new Dictionary<string, float>();
        Type dicType = dic.GetType();
        //获得Dictionary泛型参数数组的Type
        types = dicType.GetGenericArguments();
        print(types[0]);//System.String
        print(types[1]);//System.Single

        #endregion
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏