System.Reflection命名空间
(1) AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
(2) Assembly:程序集类
(3) Module:模块类
(4) Type:使用反射得到类型信息的最核心的类
一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type
1、先编译了一个类库ReflectDll 代码如下:
namespace ReflectDllOne
{
public class RelClassOne
{
public string StringOne()
{
return "I am relClassOne.StringOne with no parm";
}
public string StringOne(string parm)
{
return "I am relClassOne.StringOne with parm " + parm;
}
public static string StringOneStatic()
{
return "I am relClassOne static";
}
}
}
namespace ReflectDllTwo
{
public class RelClassTwo
{
public string StringTwo()
{
return "I am relClassTwo.StringOne with no parm";
}
public static string StringTwo(string parm)
{
return "I am relClassTwo.StringOne with parm" + parm;
}
public static string StringTwoStatic()
{
return "I am relClassTwo static";
}
}
}
2、使用反射调用ReflectDll中的方法 :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
namespace ReflectTest
{
class Program
{
Assembly ass;
Type type;
object obj;
public void ShowReflect()
{
ass = Assembly.LoadFile(@"G:\MyProject\ReflectTest\ReflectDll\ReflectDll\bin\Debug\ReflectDll.dll");//反射dll地址
type = ass.GetType("ReflectDllOne.RelClassOne");//反射的类 命名空间+类名
System.Reflection.MethodInfo method = type.GetMethod("StringOne",new Type[] {typeof(string)} ); //使用反射程序集中的方法 其中type数组中的项的个数是由要调用的方法的参数个数来决定的。如果无参数,则new Type[]{}
obj = ass.CreateInstance("ReflectDllOne.RelClassOne");//CreateInstance()一定是命名空间.类名,否则创建的实例为空
string str = (string)method.Invoke(obj, new string[]{"test"});//method.Invoke获取的是对象类型 需转换为相应类型
Console.Write(str);
Console.ReadLine();
method = type.GetMethod("StringOne", new Type[] { }); //使用反射程序集中的方法 这里因为ReflectDll.RelClassOne中的StringOne方使用了重载 所以必须做处理 用来明确到底使用了哪个方法
obj = ass.CreateInstance("ReflectDllOne.RelClassOne");
str = (string)method.Invoke(obj, null);//这个语法个人理解为:调用obj(即ReflectDllOne.RelClassOne类)的方法method(即StringOne) 参数为空(本处调用的StringOne为无参数的重载 与上文中使用的StringOne对应)
Console.Write(str);
Console.ReadLine();
method = type.GetMethod("StringOneStatic", new Type[] { });
obj = ass.CreateInstance("ReflectDllOne.RelClassOne");
str = (string)method.Invoke(null, null);
Console.Write(str);
Console.ReadLine();
}
static void Main(string[] args)
{
Program p = new Program();
p.ShowReflect();
}
}
}