C#反射之基础应用
2009-03-25 10:53
609 查看
(zzfrom:http://www.sz-accp.com.cn/xxyd/ShowArticle.asp?ArticleID=3087)
今天把反射的东西整理了一下,提供了最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用首先我们建立一个类库,将它生成为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 "私有类型的方法!";
}
}
}
后,建立再建立一个项目引入该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();
}
}
}
今天把反射的东西整理了一下,提供了最全面的东西,当然也是基础的东西,
在学好了这一切的基础上,大家可以学习反射的具体插件等应用首先我们建立一个类库,将它生成为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 "私有类型的方法!";
}
}
}
后,建立再建立一个项目引入该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();
}
}
}
相关文章推荐
- C#反射基础知识和实战应用
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#反射之基础应用实例总结
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#基础---Attribute(标签) 和 reflect(反射) 应用二
- C#反射之基础应用
- 【c#基础7】应用框架的设计与实现学习手札之类工厂服务——反射
- C#反射之基础应用
- C#基础系列:实现自己的ORM(反射以及Attribute在ORM中的应用)
- C#反射基础知识和实战应用
- C#反射之基础应用
- ASP.NET MVC 学习笔记-2.Razor语法 ASP.NET MVC 学习笔记-1.ASP.NET MVC 基础 反射的具体应用 策略模式的具体应用 责任链模式的具体应用 ServiceStack.Redis订阅发布服务的调用 C#读取XML文件的基类实现
- C#基础---Attribute(标签) 和 reflect(反射) 应用
- C#基础---Attribute(标签) 和 reflect(反射) 应用二
- C#反射基础知识和实战应用
- C#反射之基础应用
- C#基础--Attribute(标签) 和 reflect(反射) 应用
- C#学习笔记----反射基础
- C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知识)