C#反射之基础应用实例总结
程序员文章站
2023-12-19 10:27:40
本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,
在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将...
本文将反射的东西整理了一下 , 提供了最全面的东西 , 当然也是基础的东西 ,
在学好了这一切的基础上 , 大家可以学习反射的具体插件等应用 首先我们建立一个类库 , 将它生成为 reflectprj .dll,
复制代码 代码如下:
using system;
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 " 私有类型的方法!" ;
}
}
}
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;
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();
}
}
}
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#程序设计有所帮助。