C#反射之基础应用实例总结
本文将反射的东西整理了一下,提供了最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用首先我们建立一个类库,将它生成为reflectPrj.dll,
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
namespacereflectPrj
{
///<summary>
///接口
///</summary>
publicinterfaceInterface1
{
intAdd(intnum);
intAdd();
}
///<summary>
///用来被测试的类
///</summary>
publicclassReflectTest:Interface1
{
publicstringwritea;
publicstringWriteA
{
get{returnwritea;}
set{writea=value;}
}
publicstringWriteb;
publicstringWriteB
{
get{returnWriteb;}
set{Writeb=value;}
}
publicReflectTest()
{
this.WriteA="WriteA";
this.WriteB="WriteB";
}
publicReflectTest(stringa,stringb)
{
this.WriteA=a;
this.WriteB=b;
}
publicintAdd()
{
return100;
}
publicintAdd(intnum)
{
returnnum;
}
publicstringWriteString(stringa,stringb)
{
return"欢迎你,"+a+"------"+b;
}
publicstaticstringWriteName(strings)
{
return"欢迎光临,"+s;
}
publicstringWriteNoPara()
{
return"你使用的是无参数方法!";
}
privatestringWritePrivate()
{
return"私有类型的方法!";
}
}
}之后再建立一个项目引入该reflectPrj.dll
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingreflectPrj;
usingSystem.Threading;
usingSystem.Reflection;
namespacereflectPrjTest
{
classMyReflectTest
{
//建立委托
delegatestringTestDelegate(stringa,stringb);
staticvoidMain(string[]args)
{
Assemblyassembly=Assembly.Load("reflectPrj");
foreach(Typevarinassembly.GetTypes())
{
Console.WriteLine(var.Name);//显示dll下所有的类
}
//*******************************************************
Module[]modules=assembly.GetModules();
foreach(Modulemoduleinmodules)
{
Console.WriteLine("module(模块/组件)名:"+module.Name);
}
//*******************************************************
//得到具体的类的类型
Typea=typeof(reflectPrj.ReflectTest);
Console.WriteLine(a.Name);
//*******************************************************
//A------创建类型的实例---->此处是由带参的构造函数的来得到的实例
string[]paras={"aaa","bbb"};
//创建该类的实例,后面的paras为有参构造函数的参数---->此obj即是类型a的一个实例
//此实例调用的是一个带参的构造函数
objectobj=Activator.CreateInstance(a,paras);
//得到对象的属性
Console.WriteLine("得到对象a的属性:");
foreach(objectvarina.GetProperties())
{
Console.WriteLine(var.ToString());
}
MethodInfo[]miArr=a.GetMethods();
Console.WriteLine("显示所有的共有方法:");
//显示所有的共有方法
foreach(MethodInfomethodinmiArr)
{
Console.WriteLine(method.Name);
}
//************************************************************
//显示具体的方法
Console.WriteLine("显示具体的方法!");
//1.带参的方法的使用
MethodInfomi=a.GetMethod("WriteString");
stringmiReturn=(string)mi.Invoke(obj,newobject[]{"使用的是带参数的非静态方法","2"});
Console.WriteLine("---"+mi.Name+"返回值:"+miReturn);
//2.不带参数的方法调用
Console.WriteLine("不带参数的方法的调用:");
MethodInfomiNopara=a.GetMethod("WriteNoPara");
stringmiNoparaReturn=(string)miNopara.Invoke(obj,null);
Console.WriteLine("---"+miNoparaReturn);
//3.私有类型方法的使用
Console.WriteLine("私有类型方法的使用:");
MethodInfomiPrivate=a.GetMethod("WritePrivate",BindingFlags.Instance|BindingFlags.NonPublic);
stringmiPrivateReturn=(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(PropertyInfoproinpropertys)
{
//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.获取指定的属性,并赋值
PropertyInfopropertyInfo=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.字段的使用---->只能获取公开字段
FieldInfof1=a.GetField("writea",BindingFlags.Instance|BindingFlags.NonPublic|BindingFlags.Public);
Console.WriteLine(f1.GetValue(obj));
try
{
reflectPrj.ReflectTesttest=newReflectTest("Marry","Jack");
TypemyReflect=typeof(ReflectTest);
FieldInfofield1=myReflect.GetField("writea",BindingFlags.Public|BindingFlags.NonPublic|BindingFlags.Instance);
Console.WriteLine(field1.GetValue(test));
}
catch(Exceptionex)
{
Console.WriteLine(ex.Message);
}
//*******************************************************
//8.构造函数的使用
Console.WriteLine("获得构造函数的形式");
ConstructorInfo[]cis=a.GetConstructors();
foreach(ConstructorInfociincis)
{
Console.WriteLine("构造函数的形式:"+ci.ToString());//获得构造函数的形式
Console.WriteLine("构造函数名称:"+ci.Name);
}
//打印带参构造函数的形式
ConstructorInfoascSingle=a.GetConstructor(newType[]{typeof(string),typeof(string)});
Console.WriteLine(ascSingle.ToString());
//****************************************************
//9.工厂模式
Console.WriteLine(a.Name);
reflectPrj.Interface1reflectObj2=(Interface1)assembly.CreateInstance("reflectPrj.ReflectTest");
reflectPrj.ReflectTestreflectObj1=(ReflectTest)assembly.CreateInstance("reflectPrj.ReflectTest");
Console.WriteLine(reflectObj2.Add());//典型的工厂模式,在后续真正应用中使用的是接口中的方法(而接口又由实现接口的类来实现)
Console.WriteLine(reflectObj1.WriteNoPara());
//10工厂模式---方法的重载
intnum=300;
Console.WriteLine(reflectObj1.Add(300));
Console.WriteLine("工厂模式的再一次实现!");
foreach(Typetypeinassembly.GetTypes())
{
if(type.GetInterface("reflectPrj.Interface1")!=null)
{
//由接口的实现类来实现该接口
reflectPrj.Interface1interfaceObj3=(Interface1)Activator.CreateInstance(a);
Console.WriteLine(interfaceObj3.Add());
Console.WriteLine(interfaceObj3.Add(600));
}
}
//****************************************************
//11.动态创建委托的简单例子--->将委托绑定到目标方法上
TestDelegatemyMothod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),obj,mi);
Console.WriteLine(myMothod.Invoke("Tom","Jack"));
//****************************************************
//B----------.无参构造函数的使用
Console.WriteLine("无参构造函数的使用!");
//objNonePara是由ReflectTest类的构造函数所产生的对象
objectobjNonePara=Activator.CreateInstance(a);
stringinfo=((reflectPrj.ReflectTest)objNonePara).WriteNoPara();
Console.WriteLine(info);
PropertyInfoproWriteA=a.GetProperty(((ReflectTest)objNonePara).WriteA);
Console.WriteLine(proWriteA.GetValue(objNonePara,null));
proWriteA.SetValue(objNonePara,"小小郁金香",null);
Console.WriteLine(proWriteA.GetValue(objNonePara,null));
//C:---------再次用带参的构造函数来产生实例
ReflectTestobjPara=(ReflectTest)Activator.CreateInstance(a,newobject[]{"小郁","来吧"});
Console.WriteLine(objPara.WriteA+"/t"+objPara.WriteB);
Console.WriteLine(objPara.WriteNoPara());
//调用带参的方法
Console.WriteLine(objPara.WriteString("大郁","回家吧!"));
MethodInfomyMi=a.GetMethod("WriteString");
//利用委托动态的将将委托绑定的指定的方法
myMothod=(TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate),objPara,myMi);
Console.WriteLine(myMothod.Invoke("过年啦","牛年快乐啊!"));
//屏幕暂停
Console.ReadLine();
}
}
}
希望本文所述对大家的C#程序设计有所帮助。