8.Unity调用ILR对象重载方法

8.Unity调用ILRuntime-方法调用-重载方法调用


8.1 知识点

重载方法调用

重载方法调用概述

  1. 参数数量不同

    • 通过 appDomain.Invoke 调用参数数量不同格式,传入参数即可自动分别。
    • 通过 GetMethod 的第二个参数来获取对应参数个数的函数。
  2. 参数数量相同,类型不同,通过上面两种方式直接使用无法确定取出来的函数是谁,需要通过 GetMethod 方法来获取指定参数类型的函数。

    • 获取参数对应的 IType 类型,利用 appDomain 中的 GetType 方法获取指定变量类型的 IType
    • 放入参数列表中,将获取到的 IType 放入 List<IType> 中。
    • 传入 GetMethod 中获取指定类型参数,使用 GetMethod 的另一个重载,传入指定类型获取方法信息。

给Lesson4_Test添加重载方法,并重新生成

public void TestFun(int i)
{
    Debug.Log("重载函数1,传进来的参数是" + i);
}

public void TestFun(float f)
{
    Debug.Log("重载函数2,传进来的参数是" + f);
}

获取重载方法并调用

ILRuntimeManager.Instance.StartILRuntime(() =>
{
    AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
    //得到IType 通过他实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
    IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
    object obj = ((ILType)type).Instantiate(); //实例化Lesson4_Test对象


    //1.参数数量不同

    //1-1.通过appDomain.Invoke调用参数数量不同格式,传入参数即可自动分别
    appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj); //无参无返回值 成员方法调用
    appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, 1); //重载函数1,传进来的参数是1
    //对于参数数量相同 但是 类型不同时 使用这种方式 可能会报错 因为不能够明确调用的是谁
    //appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, 1.1f);//ArgumentException: Parameter type mismatch

    //1-2.通过GetMethod的第二个参数 来获取对应重载函数的参数个数的函数 
    IMethod method1 = type.GetMethod("TestFun", 0);
    IMethod method2 = type.GetMethod("TestFun", 1);

    appDomain.Invoke(method1, obj); //无参无返回值 成员方法调用
    appDomain.Invoke(method2, obj, 1); //重载函数1,传进来的参数是1
    // appDomain.Invoke(method2, obj, 1.1f);//不能正确的判断参数类型 报错 TargetException: Object does not match target type.

    //通过更节约性能的GC Alloc方式(调用完后直接回收)调用
    using (var method = appDomain.BeginInvoke(method1))
    {
        method.PushObject(obj);
        method.Invoke(); //无参无返回值 成员方法调用
    }

    using (var method = appDomain.BeginInvoke(method2))
    {
        method.PushObject(obj);
        method.PushInteger(250); //重载函数1,传进来的参数是250
        method.Invoke();
    }


    //2.参数数量相同,类型不同,通过上面两种方式直接使用无法确定取出来的函数是谁
    //  我们需要通过GetMethod方法来获取指定参数类型的函数

    //  2.1-获取参数对应的IType类型,利用appDomain中的GetType方法 获取指定变量类型的IType
    IType floatType = appDomain.GetType(typeof(float));

    //  2.2-放入参数列表中,将获取到的IType放入List<IType>中
    List<IType> list = new List<IType>();
    list.Add(floatType);//这个列表的含义是参数列表

    //  2.3-传入GetMethod中获取指定类型参数,使用GetMethod的另一个重载,传入指定类型获取方法信息
    method2 = type.GetMethod("TestFun", list, null);
    using (var method = appDomain.BeginInvoke(method2))
    {
        method.PushObject(obj);
        method.PushFloat(5.5f);
        method.Invoke(); //重载函数2,传进来的参数是5.5
    }
});

总结

  1. 方法调用,还是遵循三板斧调用规则。
  2. 参数数量不同时,通过明确参数数量来明确重载;参数数量相同,类型不同时,通过指明参数类型来明确重载。

8.2 知识点代码

Lesson4_Test

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;

namespace HotFix_Project
{
    class Lesson4_Test
    {
        #region 成员变量

        private string str;

        #endregion

        #region 成员属性

        public string Str
        {
            get
            {
                return str;
            }
            set
            {
                str = value;
            }
        }

        #endregion

        #region 构造函数

        public Lesson4_Test()
        {

        }

        public Lesson4_Test(string str)
        {
            this.str = str;
        }

        #endregion

        #region 静态方法

        public static void TestStaticFun()
        {
            Debug.Log("无参静态方法");
        }

        public static int TestStaticFun2(int i)
        {
            Debug.Log("有参静态方法" + i);

            return i + 10;
        }

        #endregion

        #region 成员方法
        public void TestFun()
        {
            Debug.Log("无参无返回值 成员方法调用");
        }

        public int TestFun2(int i)
        {
            Debug.Log("有参有返回值 成员方法调用");
            return 10 + i;
        }

        #endregion

        #region 重载方法
        public void TestFun(int i)
        {
            Debug.Log("重载函数1,传进来的参数是" + i);
        }

        public void TestFun(float f)
        {
            Debug.Log("重载函数2,传进来的参数是" + f);
        }

        #endregion

    }
}

Lesson08_Unity调用ILRuntime_方法调用_重载方法调用

using ILRuntime.CLR.Method;
using ILRuntime.CLR.TypeSystem;
using ILRuntime.Runtime.Enviorment;
using System.Collections;
using System.Collections.Generic;
using BaseFramework;
using UnityEngine;


public class Lesson08_Unity调用ILRuntime_方法调用_重载方法调用 : MonoBehaviour
{
    void Start()
    {
        #region 复习 启动ILRuntime 创建类对象

        ILRuntimeManager.Instance.StartILRuntime(() =>
        {
            AppDomain appDomain = ILRuntimeManager.Instance.appDomain;
            //得到IType 通过他实例化一个指定的热更新工程中的类对象 (Lesson4_Test)
            IType type = appDomain.LoadedTypes["HotFix_Project.Lesson4_Test"];
            object obj = ((ILType)type).Instantiate(); //实例化Lesson4_Test对象


            //1.参数数量不同

            //1-1.通过appDomain.Invoke调用参数数量不同格式,传入参数即可自动分别
            appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj); //无参无返回值 成员方法调用
            appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, 1); //重载函数1,传进来的参数是1
            //对于参数数量相同 但是 类型不同时 使用这种方式 可能会报错 因为不能够明确调用的是谁
            //appDomain.Invoke("HotFix_Project.Lesson4_Test", "TestFun", obj, 1.1f);//ArgumentException: Parameter type mismatch

            //1-2.通过GetMethod的第二个参数 来获取对应重载函数的参数个数的函数 
            IMethod method1 = type.GetMethod("TestFun", 0);
            IMethod method2 = type.GetMethod("TestFun", 1);

            appDomain.Invoke(method1, obj); //无参无返回值 成员方法调用
            appDomain.Invoke(method2, obj, 1); //重载函数1,传进来的参数是1
            // appDomain.Invoke(method2, obj, 1.1f);//不能正确的判断参数类型 报错 TargetException: Object does not match target type.

            //通过更节约性能的GC Alloc方式(调用完后直接回收)调用
            using (var method = appDomain.BeginInvoke(method1))
            {
                method.PushObject(obj);
                method.Invoke(); //无参无返回值 成员方法调用
            }

            using (var method = appDomain.BeginInvoke(method2))
            {
                method.PushObject(obj);
                method.PushInteger(250); //重载函数1,传进来的参数是250
                method.Invoke();
            }


            //2.参数数量相同,类型不同,通过上面两种方式直接使用无法确定取出来的函数是谁
            //  我们需要通过GetMethod方法来获取指定参数类型的函数

            //  2.1-获取参数对应的IType类型,利用appDomain中的GetType方法 获取指定变量类型的IType
            IType floatType = appDomain.GetType(typeof(float));

            //  2.2-放入参数列表中,将获取到的IType放入List<IType>中
            List<IType> list = new List<IType>();
            list.Add(floatType);//这个列表的含义是参数列表

            //  2.3-传入GetMethod中获取指定类型参数,使用GetMethod的另一个重载,传入指定类型获取方法信息
            method2 = type.GetMethod("TestFun", list, null);
            using (var method = appDomain.BeginInvoke(method2))
            {
                method.PushObject(obj);
                method.PushFloat(5.5f);
                method.Invoke(); //重载函数2,传进来的参数是5.5
            }
        });

        #endregion

        #region 知识点 重载方法调用

        //1.参数数量不同
        //1-1.通过appDomain.Invoke调用参数数量不同格式,传入参数即可自动分别

        //1-2.通过GetMethod的第二个参数来获取对应参数个数的函数

        //2.参数数量相同,类型不同,通过上面两种方式直接使用无法确定取出来的函数是谁
        //  我们需要通过GetMethod方法来获取指定参数类型的函数
        //  2.1-获取参数对应的IType类型,利用appDomain中的GetType方法 获取指定变量类型的IType
        //  2.2-放入参数列表中,将获取到的IType放入List<IType>中
        //  2.3-传入GetMethod中获取指定类型参数,使用GetMethod的另一个重载,传入指定类型获取方法信息

        #endregion

        #region 总结

        //1.方法调用,还是遵循三板斧调用规则
        //2.参数数量不同时,通过明确参数数量来明确重载
        //  参数数量相同,类型不同时,通过指明参数类型来明确重载

        #endregion
    }
}

8.3 练习题

练习一下Unity跨域调用ILRuntime中的重载方法



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

×

喜欢就点赞,疼爱就打赏