首页 > 学院 > 开发设计 > 正文

C#反射之基础应用

2019-11-17 02:51:16
字体:
来源:转载
供稿:网友
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);

<
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表