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});
        
    }
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,826评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,968评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,234评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,562评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,611评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,482评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,271评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,166评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,608评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,814评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,926评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,644评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,249评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,866评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,991评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,063评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,871评论 2 354

推荐阅读更多精彩内容