美文网首页
C#反射汇总

C#反射汇总

作者: _Youcai | 来源:发表于2022-11-10 20:55 被阅读0次

反射原理和简介

我搜了搜,大多数的帖子对于反射的介绍都有过于白话和偏离中心的问题,这里推荐菜鸟教程对于反射的介绍https://www.runoob.com/csharp/csharp-reflection.html

C#代码示例

反射目标结构

namespace ReflectionDemoNameSpace
{
    public class ReflectionMainClassBase
    {
        private int base_int = 10000;
        public const string base_const_string = "Base_Const_String_ReflectionMainClassBase";
    }

    public class ReflectionMainClass : ReflectionMainClassBase
    {
        public struct StructReflection
        {
            public int int_struct_a;
            public int int_struct_b;

            public StructReflection(int a, int b)
            {
                int_struct_a = a;
                int_struct_b = b;
            }
        }

        public class ClassReflection
        {
            public string string_class_a;
            public int int_class_a;
        
            public ClassReflection(string a, int b)
            {
                string_class_a = a;
                int_class_a = b;
            }
        }
        
        private StructReflection structEntity;
        private ClassReflection classEntity;

        private int int_value = 10;
        //属性
        private int IntEntity
        {
            get
            {
                Debug.Log("Get IntEntity");
                return int_value; 
                
            }
            set
            {
                Debug.Log(string.Format("Set IntEntity value={0}", value));
                int_value = value;
            }
        }

        ReflectionMainClass()
        {
            structEntity = new StructReflection(1,2);
            classEntity = new ClassReflection("a", 3);
            Debug.Log("No Args Constructor Invoke");
        }

        ReflectionMainClass(StructReflection a, ClassReflection b)
        {
            structEntity = a;
            classEntity = b;
            Debug.Log("Two Args Constructor Invoke");
        }

        //私密函数
        void PrivateMethod()
        {
            Debug.Log("Invoke PrivateMethod");
        }
    
        //公开函数
        public void publicMethod()
        {
            Debug.Log("Invoke publicMethod");
        }
        
        //带参函数
        public void HaveArgsMethod(StructReflection a, ClassReflection b)
        {
            Debug.Log("Invoke HaveArgsMethod");
            structEntity = a;
            classEntity = b;
        }

        //公开静态函数
        public static void PublicStaticMethod()
        {
            Debug.Log("Invoke PublicStaticMethod");
        }
    
        //私密静态函数
        static void PrivateStaticMethod()
        {
            Debug.Log("Invoke PrivateStaticMethod");
        }

        //重载函数 int a, int b
        public void HeavyLoadMethod(int a, int b)
        {
            Debug.Log(string.Format("Invoke HeavyLoadMethod1, a:{0}, b:{1}", a, b));
        }

        //重载函数 string a, string b
        public void HeavyLoadMethod(string a, string b)
        {
            Debug.Log(string.Format("Invoke HeavyLoadMethod2, a:{0}, b:{1}", a, b));
        }
        
        //重载函数 int a
        public void HeavyLoadMethod(int a)
        {
            Debug.Log(string.Format("Invoke HeavyLoadMethod3, a:{0}", a));
        }
    }
}

反射测试代码

public class ReflectionDemo : MonoBehaviour
{
    private void Awake()
    {
        //程序集反射主类型
        Assembly assembly = Assembly.Load("Share");
        Type main_type = assembly.GetType("ReflectionDemoNameSpace.ReflectionMainClass", true, true);

        //获取类型中嵌套类型和结构体类型
        Type struct_type = main_type.GetNestedType("StructReflection");
        Type class_type = main_type.GetNestedType("ClassReflection");

        /*
         * 通过无参构造生成实例
         */
        ConstructorInfo no_args_constructor =
            main_type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, null, new Type[] { }, null);
        object no_args_entity = no_args_constructor.Invoke(null);

        /*
         * 通过两参构造生成实例
         */
        ConstructorInfo two_args_constructor = main_type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance,
            null, new Type[] {struct_type, class_type}, null);
        object struct_arg_entity = Activator.CreateInstance(struct_type, new object[] {100, 100});
        object class_arg_entity = Activator.CreateInstance(class_type, new object[] {"s200", 300});
        object two_args_entity = two_args_constructor.Invoke(new object[] {struct_arg_entity, class_arg_entity});

        /*
         * 通过Activator直接生成实例
         */
        object activator_no_args_create_entity = Activator.CreateInstance(main_type, true);
        object activator_two_args_create_entity = Activator.CreateInstance(main_type,
            BindingFlags.NonPublic | BindingFlags.Instance,
            default(Binder),
            new object[] {struct_arg_entity, class_arg_entity},
            default(CultureInfo));
        
        /*
         * 获取父类的静态字段: base_const_string, 因为是静态值,所以GetValue时不需要传入实例
         */
        FieldInfo base_const_string_field_info = main_type.BaseType.GetField("base_const_string", BindingFlags.Static | BindingFlags.Public);
        string base_const_string_value = base_const_string_field_info.GetValue(null).ToString();
        
        /*
         * 获取父类的字段: base_int,因为不是静态值,所以GetValue时需要传入实例
         */
        FieldInfo base_int_field_info = main_type.BaseType.GetField("base_int", BindingFlags.NonPublic | BindingFlags.Instance);
        int base_int_value = (int)base_int_field_info.GetValue(activator_no_args_create_entity);

        /*
         * 获取类中字段: int_value
         */
        FieldInfo int_value_field_info = main_type.GetField("int_value", BindingFlags.NonPublic | BindingFlags.Instance);
        int int_value = (int)int_value_field_info.GetValue(activator_no_args_create_entity);
        
        /*
         * 获取类中字段: structEntity,并且获取该entity内字段值
         * 既可以使用上面获取到的struct_type,也可以通过struct_entity_value.GetType()来反射字段
         */
        FieldInfo struct_entity_field_info = main_type.GetField("structEntity", BindingFlags.NonPublic | BindingFlags.Instance);
        object struct_entity_value = struct_entity_field_info.GetValue(activator_no_args_create_entity);
        FieldInfo struct_entity_int_struct_a = struct_type.GetField("int_struct_a");
        int int_struct_a_value = (int)struct_entity_int_struct_a.GetValue(struct_entity_value);
        FieldInfo struct_entity_int_struct_b = struct_type.GetField("int_struct_b");
        int int_struct_b_value = (int)struct_entity_int_struct_b.GetValue(struct_entity_value);
        
        /*
         * 获取类中字段: classEntity,并且获取该entity内字段值
         * 既可以使用上面获取到的class_type,也可以通过class_entity_value.GetType()来反射字段
         */
        FieldInfo class_entity_field_info = main_type.GetField("classEntity", BindingFlags.NonPublic | BindingFlags.Instance);
        object class_entity_value = class_entity_field_info.GetValue(activator_no_args_create_entity);
        FieldInfo class_entity_string_class_a = class_type.GetField("string_class_a");
        string string_class_a_value = (string)class_entity_string_class_a.GetValue(class_entity_value);
        FieldInfo struct_entity_int_class_a = class_type.GetField("int_class_a");
        int int_class_a_value = (int)struct_entity_int_class_a.GetValue(class_entity_value);
        
        /*
         * 获取类中属性: IntEntity
         * 获取get值
         * 设置Set值
         */
        PropertyInfo property_IntEntity_info = main_type.GetProperty("IntEntity", BindingFlags.Instance | BindingFlags.NonPublic);
        int property_IntEntity_get_value = (int)property_IntEntity_info.GetValue(activator_no_args_create_entity);
        property_IntEntity_info.SetValue(activator_no_args_create_entity, 100000);
        property_IntEntity_get_value = (int)property_IntEntity_info.GetValue(activator_no_args_create_entity);
        
        /*
         * 调用类中无参私密函数: PrivateMethod
         */
        MethodInfo method_PrivateMethod_info = main_type.GetMethod("PrivateMethod", BindingFlags.NonPublic | BindingFlags.Instance);
        method_PrivateMethod_info.Invoke(activator_no_args_create_entity, null);
        
        /*
         * 调用类中无参公开函数: publicMethod
         */
        MethodInfo method_publicMethod_info = main_type.GetMethod("publicMethod");
        method_publicMethod_info.Invoke(activator_no_args_create_entity, null);
        
        /*
         * 调用公开带参函数: HaveArgsMethod
         * 需要创建创建参数的实例 
         */
        MethodInfo method_HaveArgsMethod_info = main_type.GetMethod("HaveArgsMethod", new Type[] {struct_type, class_type});
        ConstructorInfo struct_construct_info = struct_type.GetConstructor(BindingFlags.Public | BindingFlags.Instance, 
            null, 
            new Type[] {typeof(int), typeof(int) }, 
            null);
        object new_struct_entity_object = struct_construct_info.Invoke(new object[]{1111,2222});
        object new_class_entity_object = Activator.CreateInstance(class_type,
            BindingFlags.Instance | BindingFlags.Public,
            default(Binder),
            new object[] {"ccccccc", 800},
            default(CultureInfo));
        method_HaveArgsMethod_info.Invoke(activator_no_args_create_entity, new object[] {new_struct_entity_object,  new_class_entity_object});
        
        /*
         * 调用公开静态函数: PublicStaticMethod
         * 需要创建创建参数的实例 
         */
        MethodInfo static_PublicStaticMethod_info = main_type.GetMethod("PublicStaticMethod", BindingFlags.Static | BindingFlags.Public);
        static_PublicStaticMethod_info.Invoke(null, null);
        
        /*
         * 调用私密静态函数: PrivateStaticMethod
         * 需要创建创建参数的实例 
         */
        MethodInfo static_PrivateStaticMethod_info = main_type.GetMethod("PrivateStaticMethod", BindingFlags.Static | BindingFlags.NonPublic);
        static_PrivateStaticMethod_info.Invoke(null, null);
        
        /*
         * 调用重载函数: HeavyLoadMethod(int a, int b)
         */
        MethodInfo method_HeavyLoadMethod1_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(int), typeof(int)});
        method_HeavyLoadMethod1_info.Invoke(activator_no_args_create_entity, new Object[] {10, 10});
        
        /*
         * 调用重载函数: HeavyLoadMethod(string a, string b)
         */
        MethodInfo method_HeavyLoadMethod2_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(string), typeof(string)});
        method_HeavyLoadMethod2_info.Invoke(activator_no_args_create_entity, new Object[] {"aaa", "bbb"});
        
        /*
         * 调用重载函数: HeavyLoadMethod(int a)
         */
        MethodInfo method_HeavyLoadMethod3_info = main_type.GetMethod("HeavyLoadMethod",new Type[] {typeof(int)});
        method_HeavyLoadMethod3_info.Invoke(activator_no_args_create_entity, new Object[] {50000});
        
    }
}

相关文章

  • C#它山之石

    C# 使用反射技术实例化指定的类C#之玩转反射Reactive Extensions入门IoC solutions...

  • Unity 之如何写出强壮的代码

    【反射】 Unity C#基础之 反射反射,程序员的快乐 Unity C#基础之 特性,一个灵活的小工具 【多线程...

  • 目录 - C#

    总目录 C# 第01局:泛型 C# 第02局:反射 C# 第03局:特性 C# 第04局:委托 C# 第05局:事...

  • C#特性(Attribute)-现学现用

    前言 想要灵性的使用C#反射机制,特性(Attribute)的使用是必不可少的。 C# 特性(Attribute)...

  • C#反射

    C# 反射(Reflection) 反射指程序可以访问、检测和修改它本身状态或行为的一种能力。程序集包含模块,而模...

  • C#反射

    什么是元数据,什么是反射 程序是用来处理数据的,文本和特性都是数据,而程序本身(类的本身和BLC中的类) 这些也是...

  • C#反射

    根据moduleName反射到某个类某个方法 转换成DataView操作Datatable ![B(IRRLH7`...

  • C#反射

    注意:C#本身已经时候用了反射!!!! 以下了解即可不过,反射可以拿到类中private的字段,这个对编程则有用...

  • Swift中的反射Mirror

    Swift中的反射Mirror [TOC] 前言 Mirror是Swift中的反射机制,对于C#和Java开发人员...

  • C# 反射 typeof GetType

    一、typeof GetType 参考Unity C# 游戏开发 反射 Reflection 案例讲解(图文详细,...

网友评论

      本文标题:C#反射汇总

      本文链接:https://www.haomeiwen.com/subject/jhyatdtx.html