using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Reflection;
namespace 反射
{
class Program
{
static void Main(string[] args)
{
ReflcetionTest test = new ReflcetionTest();
test.ClassMemberInfo();
Console.ReadLine();
}
}
/// <summary>
/// 调试类。
/// </summary>
public class ReflcetionTest
{
/// <summary>
/// Assembly类:程序集信息。
/// </summary>
public void AssemblyTest()
{
Console.WriteLine("/t/t" + "------------Assembly类的使用------------");
Console.WriteLine();
//获取当前所执行代码的程序集信息
Assembly myAssembly = Assembly.GetExecutingAssembly();
Console.WriteLine("获取程序集位置:{0}", myAssembly.CodeBase);
Console.WriteLine("获取此程序集的入口点:{0}", myAssembly.EntryPoint);
Console.WriteLine("获取程序集的显示名称:{0}", myAssembly.FullName);
Console.WriteLine("获取包含当前程序集清单的模块:{0}", myAssembly.ManifestModule);
Console.WriteLine();
//获取当前程序集的名称及信息
AssemblyName asmName = myAssembly.GetName();
Console.WriteLine("获取或设置程序集的简单名称:{0}", asmName.Name);
Console.WriteLine("获取程序集的全名:{0}", asmName.FullName);
Console.WriteLine("获取或设置程序集的RUL位置:{0}", asmName.CodeBase);
Console.WriteLine("获取或设置程序集的主版本号、次版本号、内部版本号和修订版本号:{0}", asmName.Version);
Console.WriteLine();
//获取当前程序集的版本相关信息
System.Version asmVersion = asmName.Version;
Console.WriteLine("获取当前程序集的主版本号:{0}", asmVersion.Major);
Console.WriteLine("获取当前程序集的次版本号:{0}", asmVersion.Minor);
Console.WriteLine("获取当前程序集的内部版本号:{0}",asmVersion.Build);
Console.WriteLine("获取当前程序集的修订版本号:{0}",asmVersion.MajorRevision);
Console.WriteLine();
}
/// <summary>
/// Type类:检索类信息。
/// </summary>
public void TypeTest()
{
Console.WriteLine("/t/t" + "------------Type类的使用------------");
Console.WriteLine();
//设置被检索的类
Type myType = Type.GetType("反射.WeiMei");
//检索信息
Console.WriteLine("获取当前成员名称:{0}", myType.Name);
Console.WriteLine("获取当前完全限定名(不包括程序集):{0}",myType.FullName);
Console.WriteLine("获取当前Type所在的空间名称:{0}", myType.Namespace);
Console.WriteLine();
//检索类成员
Console.WriteLine("获取方法相关信息:{0}", myType.GetMethod("MetName").ToString());
Console.WriteLine("获取属性相关信息:{0}", myType.GetProperty("ProName").ToString());
Console.WriteLine("获取字段相关信息:{0}", myType.GetField("mName", BindingFlags.NonPublic | BindingFlags.Instance).ToString());
Console.WriteLine();
//设定自己为被检索的类
Type myThis = this.GetType();
}
/// <summary>
/// 访问类成员。
/// </summary>
public void ClassMemberInfo()
{
//指定被访问的类。
Type WMtype = Type.GetType("反射.WeiMei");
// 或者这样指定被访问的类
// WeiMei myWeiMei = new WeiMei();
// Type WMtype = myWeiMei.GetType();
Console.WriteLine("/t/t" + "------------MemberInfo访问类的所有成员------------");
Console.WriteLine();
//MemberInfo类:遍历被访问类的所有成员。
MemberInfo[] members = WMtype.GetMembers(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (MemberInfo member in members)
{
Console.WriteLine("成员名称:{0}--------" + "成员类型:{1}", member.Name, member.MemberType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------MethodInfo访问类的方法------------");
Console.WriteLine();
//MethodInfo类:遍历被访问类的方法。
MethodInfo[] methods = WMtype.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (MethodInfo method in methods)
{
Console.WriteLine("方法名称:{0}--------" + "方法类型:{1}", method.Name, method.ReturnType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------PropertyInfo访问类的属性------------");
Console.WriteLine();
//PropertyInfo类:遍历被访问类的属性。
PropertyInfo[] propertys = WMtype.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (PropertyInfo property in propertys)
{
Console.WriteLine("属性名称:{0}--------" + "属性类型:{1}", property.Name, property.PropertyType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------FieldInfos访问类的字段------------");
Console.WriteLine();
//FieldInfo类:遍历被访问类的字段。
FieldInfo[] fields = WMtype.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (FieldInfo field in fields)
{
Console.WriteLine("字段名称:{0}--------" + "字段类型:{1}", field.Name, field.FieldType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------ConstructorInfo访问类的构造函数------------");
Console.WriteLine();
//ConstructorInfo类:遍历被访问类的构造函数。
ConstructorInfo[] constructors = WMtype.GetConstructors(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (ConstructorInfo constructor in constructors)
{
Console.WriteLine("构造函数名称:{0}--------" + "构造函数类型:{1}", constructor.Name, constructor.MemberType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------EventInfo用于访问类的事件元数据------------");
Console.WriteLine();
//EventInfo类:遍历被访问类的事件。
EventInfo[] eventinfos = WMtype.GetEvents(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly);
foreach (EventInfo eventinfo in eventinfos)
{
Console.WriteLine("事件名称:{0}--------" + "成员类型:{1}", eventinfo.Name, eventinfo.MemberType);
}
Console.WriteLine();
//-------------------------------------------------------------------------------------------------------------------------------------------
Console.WriteLine("/t/t" + "------------ParameterInfo用于表示参数的元数据------------");
Console.WriteLine();
//ParameterInfo类:检索WeiMei类中的MetName方法()的参数
MethodInfo myMethod = WMtype.GetMethod("TestName");
ParameterInfo[] paramets = myMethod.GetParameters();
int count = 0;
foreach (ParameterInfo paramet in paramets)
{
count++;
Console.WriteLine("参数" + count + "名称:{0};类型:{1}", paramet.Name,paramet.ParameterType);
}
Console.WriteLine();
}
/// <summary>
/// 操作类成员。
/// </summary>
public void OperMembers()
{
//指定被访问的类。
WeiMei weiMeiObj = new WeiMei();
Type WMtype = weiMeiObj.GetType();
// 或者这样指定被访问类
// Type WMtype = Type.GetType("反射.WeiMei");
//操作方法
string[] parName = new String[] { "WeiMeiHua" }; //方法参数的值
MethodInfo method = WMtype.GetMethod("MetName");
method.Invoke(weiMeiObj, parName);
Console.WriteLine("操作方法改变值后为:{0}", weiMeiObj.ProName);
//操作属性
PropertyInfo proper = WMtype.GetProperty("ProName");
proper.SetValue(weiMeiObj, "HuaWeiMei", null);
Console.WriteLine("操作属性改变值后为:{0}", weiMeiObj.ProName);
//操作字段
FieldInfo field = WMtype.GetField("mName", BindingFlags.NonPublic | BindingFlags.Instance);
field.SetValue(weiMeiObj, "WeiMei");
Console.WriteLine("操作字段改变值后为:{0}", weiMeiObj.ProName);
Console.WriteLine();
//操作事件
EventInfo eventInfo = WMtype.GetEvent("WMShout");
Console.WriteLine("声明该成员的类:{0}", eventInfo.DeclaringType);
Console.WriteLine("事件名称:{0}", eventInfo.Name);
Console.WriteLine("事件类型:{0}", eventInfo.MemberType);
Console.WriteLine();
}
}
/// <summary>
/// 被检索/访问的类。
/// </summary>
public class WeiMei
{
//字段
private string mName;
private string mSix;
private int mAge;
//构造函数
public WeiMei()
{
mName = "LiuWeiMei";
mSix= "gril";
mAge = 20;
}
public WeiMei(string name, string six, int age)
{
mName = name;
mSix = six;
mAge = age;
}
//属性
public string ProName
{
get { return mName; }
set { mName = value; }
}
public string ProSix
{
get { return mSix; }
set { mSix = value; }
}
public int ProAge
{
get { return mAge; }
set { mAge = value; }
}
private string ProLoveYou
{
get { return "这是一个秘密,只有我才知道"; }
}
//方法
public string MetName(string herName)
{
this.mName = herName;
return mName;
}
public string MetSix(string herSix)
{
this.mSix = herSix;
return mSix;
}
public int MetAge(int herAge)
{
this.mAge = herAge;
return mAge;
}
private string MetLoveYou()
{
return "这是一个秘密,只有我才知道";
}
public string TestName(string herName, int like, float love)
{
this.mName = herName;
return mName;
}
//声明委托
public delegate string WMName(string wmName);
//声明事件1
public event WMName WMShout;
//声明事件2
private event WMName WMLove;
}
}