今天把反射的东西整理了一下,提供了最全面的东西,当然也是基础的东西, 在学好了这一切的基础上,大家可以学习反射的具体插件等应用首先我们建立一个类库,将它生成为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);
<新闻热点
疑难解答