本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,
 
 在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将它生成为 reflectPrj .dll,
 
 代码如下:
using System.Collections.Generic;
using System.Text;
 namespace reflectPrj
 
 {
 
 /// <summary>
 
 /// 接口
 
 /// </summary>
 
 public interface Interface1
 
 {
 
 int Add(int num);
 
 int Add();
 
 }
 
 /// <summary>
 
 /// 用来被测试的类
 
 /// </summary>
 
 public class ReflectTest : Interface1
 
 {
public string writea;
 public string WriteA
 
 {
 
 get { return writea; }
 
 set { writea = value ; }
 
 }
public string Writeb;
 public string WriteB
 
 {
 
 get { return Writeb; }
 
 set { Writeb = value ; }
 
 }
 public ReflectTest()
 
 {
 
 this .WriteA = “WriteA” ;
 
 this .WriteB = “WriteB” ;
 
 }
 public ReflectTest(string a, string b)
 
 {
 
 this .WriteA = a;
 
 this .WriteB = b;
 
 }
 public int Add()
 
 {
 
 return 100;
 
 }
 
 public int Add(int num)
 
 {
 
 return num;
 
 }
 public string WriteString(string a,string b)
 
 {
 
 return ” 欢迎你,” + a + “——” +b;
}
 public static string WriteName(string s)
 
 {
 
 return ” 欢迎光临,” + s;
 
 }
 public string WriteNoPara()
 
 {
 
 return ” 你使用的是无参数方法!” ;
 
 }
 private string WritePrivate()
 
 {
 
 return ” 私有类型的方法!” ;
 
 }
 
 }
 
 }
之后再建立一个项目引入该 reflectPrj .dll
 
 代码如下:
using System.Collections.Generic;
using System.Text;
using reflectPrj;
using System.Threading;
using System.Reflection;
 namespace reflectPrjTest
 
 {
 
 class MyReflectTest
 
 {
 
 // 建立委托
 
 delegate string TestDelegate (string a,string b);
 static void Main(string [] args)
 
 {
 
 Assembly assembly= Assembly .Load(“reflectPrj” );
 foreach (Type var in assembly.GetTypes())
 
 {
 
 Console .WriteLine(var.Name);// 显示dll 下所有的类
 
 }
//*******************************************************
Module [] modules = assembly.GetModules();
 foreach (Module module in modules)
 
 {
 
 Console .WriteLine(“module( 模块/ 组件) 名:” +module.Name);
 
 }
 //*******************************************************
 
 // 得到具体的类的类型
 
 Type a = typeof (reflectPrj.ReflectTest );
Console .WriteLine(a.Name);
 //*******************************************************
 
 //A—— 创建类型的实例—-> 此处是由带参的构造函数的来得到的实例
 
 string [] paras ={“aaa” ,”bbb” };
 
 // 创建该类的实例,后面的paras 为有参构造函数的参数—-> 此obj 即是类型a 的一个实例
 
 // 此实例调用的是一个带参的构造函数
 
 object obj = Activator .CreateInstance(a,paras);
 // 得到对象的属性
 
 Console .WriteLine(” 得到对象a 的属性:” );
 
 foreach (object var in a.GetProperties())
 
 {
 
 Console .WriteLine(var.ToString());
 
 }
MethodInfo [] miArr = a.GetMethods();
 Console .WriteLine(” 显示所有的共有方法:” );
 
 // 显示所有的共有方法
 
 foreach (MethodInfo method in miArr)
 
 {
 
 Console .WriteLine(method.Name);
 
 }
 //************************************************************
 
 // 显示具体的方法
 
 Console .WriteLine(” 显示具体的方法!” );
 //1. 带参的方法的使用
 
 MethodInfo mi = a.GetMethod(“WriteString” );
 
 string miReturn =(string ) mi.Invoke(obj, new object [] { ” 使用的是带参数的非静态方法” , “2” });
Console .WriteLine(“—” +mi.Name+” 返回值:” +miReturn);
 //2. 不带参数的方法调用
 
 Console .WriteLine(” 不带参数的方法的调用:” );
 
 MethodInfo miNopara = a.GetMethod(“WriteNoPara” );
string miNoparaReturn = (string )miNopara.Invoke(obj, null );
Console .WriteLine(“—” +miNoparaReturn);
 //3. 私有类型方法的使用
 
 Console .WriteLine(” 私有类型方法的使用:” );
 
 MethodInfo miPrivate = a.GetMethod(“WritePrivate” ,BindingFlags .Instance | BindingFlags .NonPublic);
string miPrivateReturn = (string )miPrivate.Invoke(obj, null );
Console .WriteLine(“—” +miPrivateReturn);
Console .WriteLine(“*********************** 属性的使用**********************” );
 //4. 得到对象的属性
 
 PropertyInfo [] propertys = a.GetProperties(BindingFlags .Instance | BindingFlags .NonPublic |BindingFlags .Public);
 //5. 显示所有属性名
 
 Console .WriteLine(” 对象的所有属性名如下:” );
 
 foreach (PropertyInfo pro in propertys)
 
 {
 
 //Console.WriteLine(pro.Name);
 
 // 获取属性最初的值
 
 Console .WriteLine(pro.Name+” :” +pro.GetValue(obj,null ));
 // 给属性重新赋值
 
 pro.SetValue(obj, ” 张三丰” , null );
 
 Console .WriteLine(pro.Name + ” :” + pro.GetValue(obj, null ));
}
 //6. 获取指定的属性,并赋值
 
 PropertyInfo propertyInfo=a.GetProperty(“WriteA” ,BindingFlags .Instance| BindingFlags .NonPublic|BindingFlags .Public);
propertyInfo.SetValue(obj, ” 郁金香” , null );
Console .WriteLine(propertyInfo.Name+” :” +propertyInfo.GetValue(obj,null ));
 Console .WriteLine(“*********************FieldInfo— 公开字段的使用***********************” );
 
 //7. 字段的使用—-> 只能获取公开字段
 
 FieldInfo f1 = a.GetField(“writea” ,BindingFlags .Instance| BindingFlags .NonPublic| BindingFlags.Public);
Console .WriteLine(f1.GetValue(obj));
 try
 
 {
 
 reflectPrj.ReflectTest test = new ReflectTest (“Marry” , “Jack” );
Type myReflect = typeof (ReflectTest );
FieldInfo field1= myReflect.GetField(“writea” , BindingFlags .Public | BindingFlags .NonPublic |BindingFlags .Instance);
 Console .WriteLine(field1.GetValue(test));
 
 }
 
 catch (Exception ex)
 
 {
 
 Console .WriteLine(ex.Message);
 
 }
 //*******************************************************
 
 //8. 构造函数的使用
 
 Console .WriteLine(” 获得构造函数的形式” );
 
 ConstructorInfo [] cis =a.GetConstructors();
 
 foreach (ConstructorInfo ci in cis)
 
 {
 
 Console .WriteLine(” 构造函数的形式:” +ci.ToString());// 获得构造函数的形式
 
 Console .WriteLine(” 构造函数名称:” +ci.Name);
 
 }
 // 打印带参构造函数的形式
 
 ConstructorInfo ascSingle = a.GetConstructor(new Type [] { typeof (string ),typeof (string )});
Console .WriteLine(ascSingle.ToString());
 //****************************************************
 
 //9. 工厂模式
 
 Console .WriteLine(a.Name);
 
 reflectPrj.Interface1 reflectObj2 = (Interface1 )assembly.CreateInstance(“reflectPrj.ReflectTest” );
 
 reflectPrj.ReflectTest reflectObj1 = (ReflectTest )assembly.CreateInstance(“reflectPrj.ReflectTest” );
 Console .WriteLine(reflectObj2.Add());// 典型的工厂模式,在后续真正应用中使用的是接口中的方法(而接口又由实现接口的类来实现)
 
 Console .WriteLine(reflectObj1.WriteNoPara());
 //10 工厂模式— 方法的重载
 
 int num = 300;
 
 Console .WriteLine(reflectObj1.Add(300));
 Console .WriteLine(” 工厂模式的再一次实现!” );
 
 foreach (Type type in assembly.GetTypes())
 
 {
 
 if (type.GetInterface(“reflectPrj.Interface1” )!=null )
 
 {
 
 // 由接口的实现类来实现该接口
 
 reflectPrj.Interface1 interfaceObj3 = (Interface1 )Activator .CreateInstance(a);
 Console .WriteLine(interfaceObj3.Add());
 
 Console .WriteLine(interfaceObj3.Add(600));
 
 }
 
 }
 
 //****************************************************
 
 //11. 动态创建委托的简单例子—> 将委托绑定到目标方法上
 
 TestDelegate myMothod = (TestDelegate )Delegate .CreateDelegate(typeof (TestDelegate ),obj,mi);
Console .WriteLine(myMothod.Invoke(“Tom” , “Jack” ));
 //****************************************************
 
 //B———-. 无参构造函数的使用
 
 Console .WriteLine(” 无参构造函数的使用!” );
 //objNonePara 是由ReflectTest 类的构造函数所产生的对象
 
 object objNonePara = Activator .CreateInstance(a);
string info=((reflectPrj.ReflectTest )objNonePara).WriteNoPara();
Console .WriteLine(info);
 PropertyInfo proWriteA = a.GetProperty(((ReflectTest )objNonePara).WriteA);
 
 Console .WriteLine(proWriteA.GetValue(objNonePara,null ));
proWriteA.SetValue(objNonePara, ” 小小郁金香” , null );
Console .WriteLine(proWriteA.GetValue(objNonePara, null ));
 //C:——— 再次用带参的构造函数来产生实例
 
 ReflectTest objPara =(ReflectTest ) Activator .CreateInstance(a, new object [] {” 小郁” ,” 来吧” });
 
 Console .WriteLine(objPara.WriteA+”/t” +objPara.WriteB);
 
 Console .WriteLine(objPara.WriteNoPara());
 // 调用带参的方法
 
 Console .WriteLine(objPara.WriteString(” 大郁” , ” 回家吧!” ));
 
 MethodInfo myMi=a.GetMethod(“WriteString” );
 // 利用委托动态的将将委托绑定的指定的方法
 
 myMothod=(TestDelegate )Delegate .CreateDelegate(typeof (TestDelegate ),objPara,myMi);
 
 Console .WriteLine(myMothod.Invoke(” 过年啦” , ” 牛年快乐啊!” ));
 // 屏幕暂停
 
 Console .ReadLine();
 
 }
 
 }
 
 }
希望本文所述对大家的C#程序设计有所帮助。
 
        
