8.Unity调用ILRuntime-方法调用-重载方法调用
8.1 知识点
重载方法调用
重载方法调用概述
参数数量不同
- 通过
appDomain.Invoke
调用参数数量不同格式,传入参数即可自动分别。 - 通过
GetMethod
的第二个参数来获取对应参数个数的函数。
- 通过
参数数量相同,类型不同,通过上面两种方式直接使用无法确定取出来的函数是谁,需要通过
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
}
});
总结
- 方法调用,还是遵循三板斧调用规则。
- 参数数量不同时,通过明确参数数量来明确重载;参数数量相同,类型不同时,通过指明参数类型来明确重载。
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