前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法

作者头像
星河造梦坊官方
发布2024-08-15 19:09:12
550
发布2024-08-15 19:09:12
举报
文章被收录于专栏:星河造梦坊专栏

🟥 关于asmdef、DLL的特殊注意事项

若你要反射的脚本所在的文件夹或上层节点中含有asmdef,此时调用反射代码会报如下错误:

ArgumentException: Type cannot be null.

你添加了Assembly Definition Reference,此时运行正常了。但如果你将C#文件打包成DLL,又会报上面的错误。

DLL不支持直接直接使用 Type.GetType。

因此不要尝试网上的教程了,直接按照本文的最终方案来吧。

🟧GetType多平台方法

代码语言:javascript
复制
    private Type GetType(string typeName)
    {
        var type = Type.GetType(typeName);
        if (type != null) return type;
        foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
        {
            type = a.GetType(typeName);
            if (type != null)
                return type;
        }

        return null;
    }

🟧反射属性

代码语言:javascript
复制
    private void SetProperty(string className, string propertyName, object value)
    {
		//SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        PropertyInfo tarProperty =
            tarClass.GetProperty("hi", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

        //将 tarComponent 组件的 tarProperty属性 设置为 true
        tarProperty.SetValue(tarComponent, true);
    }

🟨反射变量

代码语言:javascript
复制
    private void SetField()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        FieldInfo tarField =
            tarClass.GetField("hii", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

        //将 tarComponent 组件的 tarField变量 设置为 true
        tarField.SetValue(tarComponent, true);
    }

🟩反射方法

代码语言:javascript
复制
    private void CallMethod()
    {
        //SKODE.Test:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("SKODE.Test");
        Component tarComponent = gameObject.GetComponent(tarClass);
        MethodInfo tarMethod =
            tarClass.GetMethod("Call", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);

        //调用 tarComponent 组件的 tarMethod方法,并传入参数 parameters。
        //若不需要传入参数,则传入null即可。
        object[] parameters = { true };
        tarMethod.Invoke(tarComponent, parameters);
    }

🟦 反射重载方法

在反射重载方法时,如果调用此重载方法,会产生"发现不明确的匹配"的错误。

AmbiguousMatchException: Ambiguous match found.

解决方案如下:

代码语言:javascript
复制
GetMethod("MethodName", new Type [] { typeof(参数类型)});

其中type数组中的项的个数是由要调用的方法的参数个数来决定的。 如果无参数,则new Type[]{},使Type数组中的项个数为0。

1️⃣ 被调用的方法

2️⃣ 反射方法

代码语言:javascript
复制
    private void CallVirtualMethod()
    {
        //Doozy.Runtime.UIManager.Containers.UIContainer:反射的类,如果有命名空间就需要加上。
        Type tarClass = GetType("Doozy.Runtime.UIManager.Containers.UIContainer");
        Component tarComponent = GetComponent(tarClass);
        MethodInfo tarMethod = tarClass.GetMethod("Hide", new Type[] { });
        tarMethod.Invoke(tarComponent, null);
    }

大家还有什么问题,欢迎在下方留言!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🟥 关于asmdef、DLL的特殊注意事项
  • 🟧GetType多平台方法
  • 🟧反射属性
  • 🟨反射变量
  • 🟩反射方法
  • 🟦 反射重载方法
    • 1️⃣ 被调用的方法
      • 2️⃣ 反射方法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档