反射无论在开发模式和实际应用中,都非常实用,下面用个小例子,来记录一下反射的简单用法
首先,准备一个将用于反射的类,并编译:
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();
总结:在一般的实践中,使用接口的方式更为方便,也能提高一定的效率。
时间: 2024-10-09 14:19:41