• 反射复习(Reflection)


    C#的反射是一个比较基础的知识,尤其是在2.0以及后续的版本上,反射的应用更是常见,也成为了许多其他技术/思想的实现基础,尤其是在设计模式中,像策略模式,工厂模式等。下面是一个非常简单的反射例子。

    首先定义一个 Person 类

    namespace Reflection {
        class Person {
            public string Name { get; set; }
            public int Age { get; set; }
            public Sex sex { get; set; }
            public Person(string name,int age,Sex s) {
                Name = name;
                Age = age;
                sex = s;
            }
            public void SayHello() {
                Console.WriteLine("Hello, I am {0}",Name);
                Console.ReadKey();
            }
        }
        enum Sex {
            male,
            female
        }
    }

    然后要动态的创建这个Person类的实例,注意,这次我们并不是 new ,而是通过反射来创建这个 Person 类的实例。

    创建这个实例这可以用下面这句,因为Person的构造是必须传入参数的,所以要传递初始值。

    Type t = typeof(Person);

    Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male });

    这样就创建了一个 Person 类的实例。

    下一步可以动态的来修改 Name 属性的值:

    PropertyInfo p_name = obj.GetType().GetProperty("Name");
    if (p_name != null && p_name.CanRead) {
        p_name.SetValue(obj, "Jonathan", null);
    }

    最后,可以调用创建实例的方法:

    MethodInfo m = obj.GetType().GetMethod("SayHello");
    m.Invoke(obj,null);

    完整代码如下:

    namespace Reflection {
        class Program {
            static void Main(string[] args) {
                Type t = typeof(Person);
                Object obj = Activator.CreateInstance(t, new Object[] { "Jerry", 30, Sex.male });
                PropertyInfo p_name = obj.GetType().GetProperty("Name");
                if (p_name != null && p_name.CanRead) {
                    p_name.SetValue(obj, "Jonathan", null);
                }
                MethodInfo m = obj.GetType().GetMethod("SayHello");
                m.Invoke(obj,null);
            }
        }
    }

    这里只是简单的复习了一下反射的基础知识。

  • 相关阅读:
    WPF多路绑定
    ConfigurationManager
    开发小技巧1——Logger
    C#对json数据的解析
    Process类
    JS获取访客IP+判断归属地+自动跳转
    织梦默认编辑器换成kindEditor实操教程
    linux中添加环境变量(python为例)
    原生javascript实现省市区三级联动
    kali安装火狐浏览器
  • 原文地址:https://www.cnblogs.com/codehunter008/p/1431556.html
Copyright © 2020-2023  润新知