zoukankan      html  css  js  c++  java
  • 反射简单示例

    反射无论在开发模式和实际应用中,都非常实用,下面用个小例子,来记录一下反射的简单用法

    首先,准备一个将用于反射的类,并编译:

        public class Point {
            private int _x;
            private int _y;
    
            public int X {
                set { this._x = value; }
                get { return _x; }
            }
    
            public int Y {
                set { this._y = value; }
                get { return _y; }
            }
            public void Print() {
                Console.WriteLine("[{0},{1}]", this.X,this.Y);
            }

    编译后记录编译后的路径,用于示例类进行反射

                string assemblyName = @"具体路径\Point.dll";
                string typeName = "aaa.Point";  
                Assembly assembly = Assembly.LoadFrom(assemblyName);  //手动加载程序集
                //获取类型信息
                Type t = assembly.GetType(typeName);
                //根据类型创建对象
                object dObj = Activator.CreateInstance(t);
                //如果是字段,用下面方式赋值,本示例中是属性用PropertyInfo赋值
                //FieldInfo field1 = t.GetField("x");
                //FieldInfo field2 = t.GetField("y");
                //field1.SetValue(dObj, 100);   
                //field2.SetValue(dObj, 200);
    
                PropertyInfo property1 = t.GetProperty("X");
                PropertyInfo property2 = t.GetProperty("Y");
                property1.SetValue(dObj, 111, null);
                property2.SetValue(dObj, 222, null);
                //获取方法的信息
                MethodInfo method = t.GetMethod("Print");
                method.Invoke(dObj,null);//执行方法 

    通过上面那个方法,我们已经可以给类的字段属性赋值,也可以通过反射来执行类的方法,执行的方法也可以传递参数数组。大家注意到上面我们获得的类型我们并不清楚什么类型,我们下面给他扩展一下,也就是公开接口,反射类中和示例中分别引用这一技口,反身类并且继承这一接口

    public class Point:IPoint    //反射类实现接口
    
                string assemblyName = @"具体路径\Point.dll";
                string typeName = "aaa.Point";
    
                Assembly assembly = Assembly.LoadFrom(assemblyName);  //手动加载程序集
                Type type = assembly.GetType(typeName);           //获取程序集中的类型
    
                IPoint obj = (IPoint)Activator.CreateInstance(type);  //通过接口创建对象实例
                obj.X = 100;
                obj.Y = 200;
                obj.Print();  

    总结:在一般的实践中,使用接口的方式更为方便,也能提高一定的效率。

  • 相关阅读:
    flex
    当前不会命中断点 源代码与原始版本不一致
    c setjmp longjmp
    VS 快捷键设置
    Lua C API 遍历 table
    lua class
    复习 C++ 中类的函数指针
    apache ab
    rabbitmq
    协程 coroutine
  • 原文地址:https://www.cnblogs.com/sky2014/p/4203392.html
Copyright © 2011-2022 走看看