找回密码
 立即注册
查看: 367|回复: 0

面向对象的反射框架UnityCsReflection——简单示例

[复制链接]
发表于 2023-4-4 14:23 | 显示全部楼层 |阅读模式
跳转至专题目录
专题推荐文章:


  • 温故知新——RectTransform成员属性的再认识
  • unity Scene View扩展之编辑器扩展总结
  • Unity获取鼠标点击ui GameObject
  • 添加Inspector上的Add Component回调功能
本系列目录


  • UnityCsReflection面向对象的反射框架介绍
  • 面向对象的反射框架UnityCsReflection用途介绍
  • 面向对象的反射框架UnityCsReflection——简单示例
<hr/>现在假如dll里面有这么两个类,ATest,BTest,我们需要调用里面的私有成员和私有函数。
namespace Hvak.Editor.Refleaction
{

        class ATest
        {
                int a = 2;

                void Log()
                {
                        Debug.Log("Log ATest");
                }
        }

        class BTest
        {
                string str = "hello world!";

                ATest aTest
                {
                        get; set;
                } = new ATest();
        }
}

1、首先我们设置反射生成代码的参数,然后因为生成的代码比较长,所以放到了最后。
                [MenuItem("Tools/NewGenerate")]
                static void GenerateNewWay()
                {
                        // 0、如果需要用到dll的别名,可以在这里注册。(因为不知道怎么反射dll的alias名,先用笨方法,手动注册了)
                        ModuleAliasConfig.Set("", "");
                        // 1、指定生成代码的文件夹路径
                        GenerateRtype.UnityCSReflectionPath = $"{Application.dataPath}/UnityCsReflection/";
                        // 2、添加需要生成的类,重载了三种接口,这是其中传入类型名字的接口,其余两种是传类型列表,传实例列表
                        GenerateRtype.Generate(new List<string> { "UnityType", "ComponentDropdownItem", "AddComponentWindow", "PackageManagerWindow", "BTest" });
                }

2、生成了RType之后,可以按照以下方法调用ATest,BTest相关成员变量和方法。
                static void TestRType()
                {
                        // 1、这里虽然是直接new了一个BTest,但是现实情况可能通过其他手段拿到的BTest实例
                        BTest bTest = new BTest();
                        // 2、new一个RBTest,并把BTest的实例传进去
                        RBTest rBTest = new RBTest(bTest);
                        // 3、尝试调用通过RBTest来调用BTest里面的private field
                        Debug.Log(rBTest.RFstr.Value);
                        // 4、尝试调用通过RBTest来调用BTest里面的private property
                        Debug.Log(rBTest.RPaTest.RFa.Value);
                        // 5、尝试调用通过RBTest来调用BTest里面的private method
                        rBTest.RPaTest.Log();
                }
3、输出结果



3、github
跳转中... (zhihu.com)中的  GenerateRClassTest.cs
<hr/>
自动生成的代码模样
using Hvak.Editor.Refleaction;
using System;
using System.Reflection;

namespace Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction
{
        /// <summary>
        /// Hvak.Editor.Refleaction.BTest
        /// </summary>
    public partial class RBTest : RMember //
    {

                /// <summary>
                /// System.String str
                /// </summary>
                protected Hvak.Editor.Refleaction.RSystem.RString r_Fstr;
                public virtual Hvak.Editor.Refleaction.RSystem.RString RFstr
                {
                        get
                        {
                                if(r_Fstr == null)
                                {
                                        r_Fstr = new(this, "str");
                                }
                                return r_Fstr;
                        }
                }

                /// <summary>
                /// Hvak.Editor.Refleaction.ATest <aTest>k__BackingField
                /// </summary>
                protected Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction.RATest r_F__0__aTest__1__k__BackingField;
                public virtual Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction.RATest RF__0__aTest__1__k__BackingField
                {
                        get
                        {
                                if(r_F__0__aTest__1__k__BackingField == null)
                                {
                                        r_F__0__aTest__1__k__BackingField = new(this, "<aTest>k__BackingField");
                                }
                                return r_F__0__aTest__1__k__BackingField;
                        }
                }

                /// <summary>
                /// Hvak.Editor.Refleaction.ATest aTest
                /// </summary>
                protected Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction.RATest r_PaTest;
                public virtual Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction.RATest RPaTest
                {
                        get
                        {
                                if(r_PaTest == null)
                                {
                                        r_PaTest = new(this, "aTest", -1);
                                }
                                return r_PaTest;
                        }
                }

                /// <summary>
                /// Boolean Equals(System.Object)
                /// </summary>
                protected RMethod r_MEquals_Object;
                public virtual RMethod RMEquals_Object
                {
                        get
                        {
                                if(r_MEquals_Object == null)
                                {
                                        r_MEquals_Object = new(this, "Equals", 0, typeof(System.Object));
                                }
                                return r_MEquals_Object;
                        }
                }

                /// <summary>
                /// Void Finalize()
                /// </summary>
                protected RMethod r_MFinalize;
                public virtual RMethod RMFinalize
                {
                        get
                        {
                                if(r_MFinalize == null)
                                {
                                        r_MFinalize = new(this, "Finalize", 0);
                                }
                                return r_MFinalize;
                        }
                }

                /// <summary>
                /// Int32 GetHashCode()
                /// </summary>
                protected RMethod r_MGetHashCode;
                public virtual RMethod RMGetHashCode
                {
                        get
                        {
                                if(r_MGetHashCode == null)
                                {
                                        r_MGetHashCode = new(this, "GetHashCode", 0);
                                }
                                return r_MGetHashCode;
                        }
                }

                /// <summary>
                /// System.Type GetType()
                /// </summary>
                protected RMethod r_MGetType;
                public virtual RMethod RMGetType
                {
                        get
                        {
                                if(r_MGetType == null)
                                {
                                        r_MGetType = new(this, "GetType", 0);
                                }
                                return r_MGetType;
                        }
                }

                /// <summary>
                /// System.Object MemberwiseClone()
                /// </summary>
                protected RMethod r_MMemberwiseClone;
                public virtual RMethod RMMemberwiseClone
                {
                        get
                        {
                                if(r_MMemberwiseClone == null)
                                {
                                        r_MMemberwiseClone = new(this, "MemberwiseClone", 0);
                                }
                                return r_MMemberwiseClone;
                        }
                }

                /// <summary>
                /// System.String ToString()
                /// </summary>
                protected RMethod r_MToString;
                public virtual RMethod RMToString
                {
                        get
                        {
                                if(r_MToString == null)
                                {
                                        r_MToString = new(this, "ToString", 0);
                                }
                                return r_MToString;
                        }
                }


        public RBTest() : base("Hvak.Editor.Refleaction.BTest")
        {
        }

        public RBTest(System.Object instance) : base("Hvak.Editor.Refleaction.BTest")
                {
            SetInstance(instance);
                }

        public RBTest(RMember belongMember, string name, int genericCount = -1, params Type[] types) : base(belongMember, name, genericCount, types)
            {
            }

                 public RBTest(Type belongType, string name, int genericCount = -1, params Type[] types) : base(belongType, name, genericCount, types)
            {
            }

        public virtual System.Boolean Equals(System.Object @obj)
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{@obj};
            var ___result = RMEquals_Object.Invoke(___genericsType, ___parameters);

            return (System.Boolean)___result;
        }


        public virtual void Finalize()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMFinalize.Invoke(___genericsType, ___parameters);

            
        }


        public virtual System.Int32 GetHashCode()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMGetHashCode.Invoke(___genericsType, ___parameters);

            return (System.Int32)___result;
        }


        public virtual System.Type GetType()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMGetType.Invoke(___genericsType, ___parameters);

            return (System.Type)___result;
        }


        public virtual System.Object MemberwiseClone()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMMemberwiseClone.Invoke(___genericsType, ___parameters);

            return (System.Object)___result;
        }


        public virtual System.String ToString()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMToString.Invoke(___genericsType, ___parameters);

            return (System.String)___result;
        }


    }
}

using Hvak.Editor.Refleaction;
using System;
using System.Reflection;

namespace Hvak.Editor.Refleaction.RHvak.REditor.RRefleaction
{
        /// <summary>
        /// Hvak.Editor.Refleaction.ATest
        /// </summary>
    public partial class RATest : RMember //
    {

                /// <summary>
                /// System.Int32 a
                /// </summary>
                protected Hvak.Editor.Refleaction.RSystem.RInt32 r_Fa;
                public virtual Hvak.Editor.Refleaction.RSystem.RInt32 RFa
                {
                        get
                        {
                                if(r_Fa == null)
                                {
                                        r_Fa = new(this, "a");
                                }
                                return r_Fa;
                        }
                }

                /// <summary>
                /// Void Log()
                /// </summary>
                protected RMethod r_MLog;
                public virtual RMethod RMLog
                {
                        get
                        {
                                if(r_MLog == null)
                                {
                                        r_MLog = new(this, "Log", 0);
                                }
                                return r_MLog;
                        }
                }

                /// <summary>
                /// Boolean Equals(System.Object)
                /// </summary>
                protected RMethod r_MEquals_Object;
                public virtual RMethod RMEquals_Object
                {
                        get
                        {
                                if(r_MEquals_Object == null)
                                {
                                        r_MEquals_Object = new(this, "Equals", 0, typeof(System.Object));
                                }
                                return r_MEquals_Object;
                        }
                }

                /// <summary>
                /// Void Finalize()
                /// </summary>
                protected RMethod r_MFinalize;
                public virtual RMethod RMFinalize
                {
                        get
                        {
                                if(r_MFinalize == null)
                                {
                                        r_MFinalize = new(this, "Finalize", 0);
                                }
                                return r_MFinalize;
                        }
                }

                /// <summary>
                /// Int32 GetHashCode()
                /// </summary>
                protected RMethod r_MGetHashCode;
                public virtual RMethod RMGetHashCode
                {
                        get
                        {
                                if(r_MGetHashCode == null)
                                {
                                        r_MGetHashCode = new(this, "GetHashCode", 0);
                                }
                                return r_MGetHashCode;
                        }
                }

                /// <summary>
                /// System.Type GetType()
                /// </summary>
                protected RMethod r_MGetType;
                public virtual RMethod RMGetType
                {
                        get
                        {
                                if(r_MGetType == null)
                                {
                                        r_MGetType = new(this, "GetType", 0);
                                }
                                return r_MGetType;
                        }
                }

                /// <summary>
                /// System.Object MemberwiseClone()
                /// </summary>
                protected RMethod r_MMemberwiseClone;
                public virtual RMethod RMMemberwiseClone
                {
                        get
                        {
                                if(r_MMemberwiseClone == null)
                                {
                                        r_MMemberwiseClone = new(this, "MemberwiseClone", 0);
                                }
                                return r_MMemberwiseClone;
                        }
                }

                /// <summary>
                /// System.String ToString()
                /// </summary>
                protected RMethod r_MToString;
                public virtual RMethod RMToString
                {
                        get
                        {
                                if(r_MToString == null)
                                {
                                        r_MToString = new(this, "ToString", 0);
                                }
                                return r_MToString;
                        }
                }


        public RATest() : base("Hvak.Editor.Refleaction.ATest")
        {
        }

        public RATest(System.Object instance) : base("Hvak.Editor.Refleaction.ATest")
                {
            SetInstance(instance);
                }

        public RATest(RMember belongMember, string name, int genericCount = -1, params Type[] types) : base(belongMember, name, genericCount, types)
            {
            }

                 public RATest(Type belongType, string name, int genericCount = -1, params Type[] types) : base(belongType, name, genericCount, types)
            {
            }

        public virtual void Log()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMLog.Invoke(___genericsType, ___parameters);

            
        }


        public virtual System.Boolean Equals(System.Object @obj)
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{@obj};
            var ___result = RMEquals_Object.Invoke(___genericsType, ___parameters);

            return (System.Boolean)___result;
        }


        public virtual void Finalize()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMFinalize.Invoke(___genericsType, ___parameters);

            
        }


        public virtual System.Int32 GetHashCode()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMGetHashCode.Invoke(___genericsType, ___parameters);

            return (System.Int32)___result;
        }


        public virtual System.Type GetType()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMGetType.Invoke(___genericsType, ___parameters);

            return (System.Type)___result;
        }


        public virtual System.Object MemberwiseClone()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMMemberwiseClone.Invoke(___genericsType, ___parameters);

            return (System.Object)___result;
        }


        public virtual System.String ToString()
        {

            var ___genericsType = new Type[] {};
            var ___parameters = new object[]{};
            var ___result = RMToString.Invoke(___genericsType, ___parameters);

            return (System.String)___result;
        }


    }
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-16 20:29 , Processed in 0.105821 second(s), 28 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表