C#反射汇总

反射原理和简介

我搜了搜,大多数的帖子对于反射的介绍都有过于白话和偏离中心的问题,这里推荐菜鸟教程对于反射的介绍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#反射汇总)