对反射还是刚刚接触,先贴一下代码吧,太过理论的东西现在我也不大懂
1.接口
using System;
using System.Collections.Generic;
using System.Text;
namespace ReflectDll
{
interface IEatAndFly//定义一组吃饭和飞的行为
{
string Name//定义属性
{
get;
set;
}
void Fly();
void Eat();
}
}
2.类
using System;
using System.Collections.Generic;
using System.Text;
namespace ReflectDll
{
class Duck:IEatAndFly
{
private string name;
#region IEatAndFly 成员
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public void Fly()
{
Console.WriteLine("鸭子飞了");
}
public void Eat()
{
Console.WriteLine("鸭子吃饭了");
}
#endregion
public Duck(string name)
{
this.name = name;
}
//private void Add(int m, int n)
//{
// Console.WriteLine("{0}+{1}={2}", m, n, m + n);
//}
public void PubAdd(int m, int n)
{
Console.WriteLine("{0}+{1}={2}", m, n, m + n);
}
public void PubAdd(string s)
{
Console.WriteLine("string 参数方法" + s);
}
static void Main(string[] args)
{
Duck d = new Duck("SS");
d.PubAdd(2, 3);
}
}
}
测试客户端
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace Re
{
class Program
{
static void Main(string[] args)
{
Test2();
}
static void Test1()
{
Assembly ass = Assembly.Load("Genersoft.TB.Base");//这个地方时程序集名称,非DLL文件名
System.Console.WriteLine("1.Assembly的公共属性:");
#region 1.公共属性
System.Console.WriteLine("CodeBase(指定程序集的位置):" + ass.CodeBase);
System.Console.WriteLine("EntryPoint(程序集的入口点):" + ass.EntryPoint);
System.Console.WriteLine("FullName(程序集的显示名称)" + ass.FullName);
System.Console.WriteLine("GlobalAssemblyCache(是否从GAC中加载)" + ass.GlobalAssemblyCache);
System.Console.WriteLine("HostContext(获取加载程序集的宿主上下文:)" + ass.HostContext);
System.Console.WriteLine("ImageRuntimeVersion(获取公共语言运行时版本)" + ass.ImageRuntimeVersion);
System.Console.WriteLine("Location(获取包含清单的已加载的文件路径)" + ass.Location);
System.Console.WriteLine("ManifestModule(获取加载模块)" + ass.ManifestModule);
System.Console.WriteLine("ReflectionOnly(是否被加载只反射上下文)" + ass.ReflectionOnly);
#endregion
#region 2.Assembly的公共方法
AssemblyName[] assemblyName = ass.GetReferencedAssemblies();//获取改程序集引用的程序集名称
foreach (AssemblyName a in assemblyName)
{
System.Console.WriteLine("程序集名称" + a.Name);
}
Type[] types = ass.GetTypes();//为毛提示无法加载一个或多个请求的类型??? 应该是它依赖的程序集没有加载的原因,你妹的啊()
foreach (Type t in types)
{
Console.WriteLine("类型:----------" + t.Name);
BindingFlags bind = BindingFlags.Public | BindingFlags.Static;
foreach (MemberInfo m in t.GetMember("a", bind))
{
string typeName = string.Empty;
if (m is FieldInfo) typeName = "FieldInfo";
else if (m is MethodInfo) typeName = "MethodInfo";
else if (m is ConstructorInfo) typeName = "Constructor";
Console.WriteLine("成员---" + typeName + m.Name);
}
}
//Module[] moduls = ass.GetModules();//获取程序集中的模块
//foreach (Module m in moduls)
//{
// Console.WriteLine("模块"+m.Name);
//}
#endregion
//#region 3.Type的相关属性和方法
//Type type = ass.GetType();
//Console.WriteLine(type.Name);
//#endregion
//Assembly[] asss = AppDomain.CurrentDomain.GetAssemblies();
//foreach (Assembly a in asss)
//{
// Console.WriteLine("---------" + a);
// foreach (Type t in a.GetExportedTypes())
// {
// Console.WriteLine(".............." + t.Name);
// }
//}
}
static void Test2()
{
Assembly ass = Assembly.Load("ReflectDll");//建议使用的一种加载方式
Console.WriteLine("Type类型-------------------------");
Type[] types = ass.GetTypes();//调用这个方法时,如果要加载的程序集依赖的程序集没有提供,会报异常,应该是返回类吧,接口有特定的方法
foreach (Type type in types)
{
Console.WriteLine(type);
Console.WriteLine("Interface接口");
Type[] ints = type.GetInterfaces();
foreach (Type tt in ints)
{
Console.WriteLine(tt);
}
Console.WriteLine("Member成员>>>>>>>>>>>>>>>>>>>>>>");
MemberInfo[] members = type.GetMembers();//返回的是所有的共有成员
foreach (MemberInfo m in members)
{
Console.WriteLine(m.MemberType+":"+m.Name);//MemberType标志是属性,方法还是其它
}
}
Console.WriteLine("Module模块------------------------");
Module[] modules = ass.GetModules();
foreach (Module m in modules)
{
Console.WriteLine(m);
}
/*
* 1. System.Activator 的CreateInstance方法。该方法返回新对象的引用。具体使用方法参见msnd
* 2.Assembly的CreateInstance;
3. System.Activator 的createInstanceFrom 与上一个方法类似,不过需要指定类型及其程序集
4.System.Appdomain 的方法:createInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
5. System.type的InvokeMember实例方法:这个方法返回一个与传入参数相符的构造函数,并构造该类型。
6.System.reflection.constructinfo 的Invoke实例方法
*/
#region 构造实例的几种方式
//1.Activator.CreateInstance()
Type duckType = ass.GetType("ReflectDll.Duck");//要创建的实例的类型
Object[] args1 = new object[] { "我是第一种方式创建的" };
Object obj1 = Activator.CreateInstance(duckType, args1);
//2.利用Assembly.CreateInstance
Object obj2 = ass.CreateInstance("ReflectDll.Duck", true, BindingFlags.Public | BindingFlags.Instance, null, new object[] { "我是从程序集创建的" }, null, null);
//利用InvokeMember方法
Object obj3 = duckType.InvokeMember("ReflectDll.Duck", BindingFlags.Instance | BindingFlags.Public|BindingFlags.CreateInstance, null, null, new object[] { "我使用InvokeMember方法创建的" });//注意BindingFlagstaff要选择CreateInstance值
#endregion
#region 调用方法
//1,利用Type.InvokeMember方法
duckType.InvokeMember("PubAdd", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, obj1, new object[] { 1, 1 });//注意BindingFlags加上InvokeMethod,target选择已经实例好的类
//2.利用MethodInfo方法,先找到方法
Type[] ts = new Type[] { typeof(int), typeof(int) };
MethodInfo mAdd = duckType.GetMethod("PubAdd", BindingFlags.Public | BindingFlags.Instance, null, CallingConventions.Standard,ts , null);
mAdd.Invoke(obj2, new object[] { 2, 2 });
#endregion
}
}
}