您的位置:首页 > 编程语言 > C#

C#反射知识学习

2012-11-23 13:33 141 查看
近日对反射知识学习了解,在万能的WWW下,基本有了较为全面的了解。废话少说,直接上代码!!

业务组件类库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BizClassLibrary
{
[Serializable]
public class HelloWord
{
//公有字段
public string PublicField = "";

//私有字段
private string privateField = "";

//公有属性
public string PublicProperty
{
get { return this.privateField; }
set { this.privateField = value; }
}

//私有属性
private string PrivateProperty
{
get { return this.privateField; }
set { privateField = value; }
}

public HelloWord()
{}

public HelloWord(string name): base()
{
this.privateField = "带参构造函数参数值:"+ name;
}

private string PrivateMethod()
{
return "私有方法调用测试";
}

public static string PublicStaticMethod()
{
return "公有静态方法调用测试!";
}

public string SimpleNoParamsMethod()
{
return "公有无参无重载方法调用测试!" + this.privateField + this.PublicField;
}

public string SimpleHaveParamsMethod(string name)
{
return "公有有参无重载方法调用测试!参数name(string):" + name;
}

public string SayHello()
{
return "公有无参重载方法SayHello()调用测试!";
}

public string SayHello(string name)
{
return "公有单参重载方法SayHello(string name)调用测试!参数name(string):" + name;
}

public string SayHello(string name, int times)
{
return "公有多参重载方法SayHello(string name, int times)调用测试!参数name(string):" + name + ";参数times(int):" + times.ToString();
}
}

public class MyPrint
{
public string PrintInfo()
{
return "MyPrint.PrintInfo()";
}
}
}


调用测试
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;

namespace ReflectSample01
{
class Program
{
delegate string TestDelegate(string value, int value1);

static void Main(string[] args)
{
string assemblyFile = "BizClassLibrary.dll";
string assemblyQualifiedFile = AppDomain.CurrentDomain.BaseDirectory + assemblyFile;

string assemblyName = "BizClassLibrary";
string typeName = "BizClassLibrary.HelloWord";  //名称空间+类名称

System.Reflection.Assembly assembly = Assembly.LoadFrom(assemblyQualifiedFile);
Type type = assembly.GetType(typeName);

//(建议?)如果动态加载dll类库并建立类的对象用assembly; 如果用remoting或webservice之类的远程对象则用activator;
Object instance = assembly.CreateInstance(typeName);  //Assembly.CreateInstance内部调用了Activator.CreateInstance
//Object instance = Activator.CreateInstance(assembly.GetType(typeName));
//Object instance = Activator.CreateInstance(type);   //
//Object instance = Activator.CreateInstance(type, new string[] { "John" }); //带参构造函数初始化
//Object instance = Activator.CreateInstance(assemblyName, typeName).Unwrap();

Console.WriteLine("----------获取程序集下所有类名 GetTypes()------------");
foreach (Type t in assembly.GetTypes())
{
Console.WriteLine(string.Format("Name:'{0}' \t ModuleName:'{1}'", t.Name, t.Module.Name));
}

Console.WriteLine("----------获取程序集下所有模块名 GetModules()------------");
foreach (Module module in assembly.GetModules())
{
Console.WriteLine("module name:" + module.Name);
}

Console.WriteLine();

Console.WriteLine("----------获取程序集类的所有成员 GetMembers()---------");
foreach (MemberInfo m in type.GetMembers())
{
Console.WriteLine(m.Name);
}

Console.WriteLine("----------获取程序集类的所有方法 GetMethods()---------");
foreach (System.Reflection.MethodInfo m in type.GetMethods())
{
Console.WriteLine(m.Name);
}

Console.WriteLine("----------获取程序集类的所有属性 GetProperties()---------");
foreach (PropertyInfo m in type.GetProperties())
{
Console.WriteLine(m.Name);
}

Console.WriteLine("----------获取程序集类的所有字段 GetFields()---------");
foreach (FieldInfo m in type.GetFields())
{
Console.WriteLine(m.Name);
}

Console.WriteLine();
Console.WriteLine("----------反射调用执行测试结果---------");

#region 构造函数测试
Console.WriteLine("*********构造函数测试*********");
{
Object instanceObj = Activator.CreateInstance(type); //带参构造函数初始化
MethodInfo method = type.GetMethod("SimpleNoParamsMethod", new Type[] { });//方法
string s = (string)method.Invoke(instanceObj, null);   //方法调用
Console.WriteLine(s);
}

{
Object instanceObj = Activator.CreateInstance(type, new string[] { "John" }); //带参构造函数初始化
MethodInfo method = type.GetMethod("SimpleNoParamsMethod", new Type[] { });//方法
string s = (string)method.Invoke(instanceObj, null);   //方法调用
Console.WriteLine(s);
}
#endregion

#region 字段与属性测试
Console.WriteLine("*********字段与属性测试*********");
{
Object instanceObj = Activator.CreateInstance(type); //带参构造函数初始化
PropertyInfo pi = type.GetProperty("PublicProperty");
pi.SetValue(instanceObj, "我设置的公有属性值", null);
//PropertyInfo pi = type.GetProperty("PrivateProperty", BindingFlags.Instance | BindingFlags.NonPublic);
//pi.SetValue(instanceObj, "我设置的私有属性值", null);

MethodInfo method = type.GetMethod("SimpleNoParamsMethod", new Type[] { });//方法
string s = (string)method.Invoke(instanceObj, null);   //方法调用
Console.WriteLine(s);
}

{
Object instanceObj = Activator.CreateInstance(type); //带参构造函数初始化
FieldInfo fi = type.GetField("PublicField");
fi.SetValue(instanceObj, "我设置的公有字段值");
//FieldInfo fi = type.GetField("privateField", BindingFlags.Instance | BindingFlags.NonPublic);
//fi.SetValue(instanceObj, "我设置的私有字段值");

MethodInfo method = type.GetMethod("SimpleNoParamsMethod", new Type[] { });//方法
string s = (string)method.Invoke(instanceObj, null);   //方法调用
Console.WriteLine(s);
}

#endregion

#region 方法调用测试
Console.WriteLine("*********方法测试*********");
{
//私有方法
MethodInfo method = type.GetMethod("PrivateMethod", BindingFlags.Instance | BindingFlags.NonPublic);
string s = (string)method.Invoke(instance, null);
Console.WriteLine(s);
}

{
MethodInfo method = type.GetMethod("PublicStaticMethod", new Type[] { });//方法
string s = (string)method.Invoke(null, null);   //静态方法调用
Console.WriteLine(s);

}

{
MethodInfo method = type.GetMethod("SimpleNoParamsMethod", new Type[] { });//方法
string s = (string)method.Invoke(instance, null);   //方法调用
Console.WriteLine(s);
}

{
MethodInfo method = type.GetMethod("SimpleHaveParamsMethod");//方法
string s = (string)method.Invoke(instance, new string[] { "John" });   //方法调用
Console.WriteLine(s);
}

{
MethodInfo method = type.GetMethod("SayHello", new Type[] { });//方法的名称,方法有重载时需加参数new Type[]{}
string s = (string)method.Invoke(instance, null);
Console.WriteLine(s);
}

{
MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(System.String) });//方法
string s = (string)method.Invoke(instance, new string[] { "John" });
Console.WriteLine(s);
}

{
MethodInfo method = type.GetMethod("SayHello", new Type[] { typeof(System.String), typeof(int) });//方法
string s = (string)method.Invoke(instance, new object[] { "John", 5 });
Console.WriteLine(s);
}
#endregion

#region InvokeMember方式
Console.WriteLine("*********InvokeMember方式测试*********");
{
object s = type.InvokeMember("PrivateMethod", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, instance, null);
Console.WriteLine(s.ToString());
}

{
object s = type.InvokeMember("SimpleHaveParamsMethod", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, instance, new string[] { "alice" });
Console.WriteLine(s.ToString());
}

{
object s = type.InvokeMember("SayHello", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, instance, new object[] { "applo" });
Console.WriteLine(s.ToString());
}

{
object s = type.InvokeMember("SayHello", BindingFlags.Instance | BindingFlags.Public | BindingFlags.InvokeMethod, null, instance, new object[] { "zeus", 3 });
Console.WriteLine(s.ToString());
}
#endregion

Console.ReadLine();
}
}
}

MSDN参考 http://msdn.microsoft.com/zh-cn/library/vstudio/f7ykdhsy.aspx

转载一篇相关文章 /article/4671523.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: