博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

初探反射(二)之晚期绑定动态调用实体方法

Posted on 2010-11-27 15:20  Mr.X  阅读(973)  评论(8编辑  收藏  举报

前面讲过程序集里面主要包含有CIL代码,元数据,程序集清单。程序集清单是做什么用的呢?它将指出如要正确运行这个程序集需要引用的外部程序集(Dll)等,这就是程序清单的作用。那么什么是晚期绑定呢

首先看看如下代码:

 

代码
namespace Model
{
[Serializable]
public class Jobs
{

//自动生成字段
private string job_desc;
private short job_id;
private byte max_lvl;
private byte min_lvl;

//自动生成默认无参构造函数
public Jobs()
{
}

//自动生成全参参构造函数
public Jobs(string job_desc, short job_id, byte max_lvl, byte min_lvl)
{
this.job_desc = job_desc;
this.job_id = job_id;
this.max_lvl = max_lvl;
this.min_lvl = min_lvl;
}

//自动生成属性
public string Job_desc
{
get { return job_desc;}
set { job_desc = value;}
}

public short Job_id
{
get { return job_id;}
set { job_id = value;}
}

public byte Max_lvl
{
get { return max_lvl;}
set { max_lvl = value;}
}

public byte Min_lvl
{
get { return min_lvl;}
set { min_lvl = value;}
}

public void Sends(string a, string b)
{
Console.WriteLine(
"你说是{0}呢还是{1}", a, b);
}
}
}

 

还是之前的那个实体类 我给它加了一个sneds()的方法 这个方法有2个参数;

那我们看看是怎样来调用这个实体类中的方法的。

代码如下:

 

static void Main(string[] args)
{
Assembly asm
= null;
try
{
asm
= Assembly.Load("Model");
}
catch(FileLoadException e)
{
Console.WriteLine(e.Message);
}

Type t
= asm.GetType("Model.Jobs");
object o = Activator.CreateInstance(t);
object[] ol = new object[2];
ol[
0]="出去玩";
ol[
1]="回家!";
MethodInfo mi
= t.GetMethod("Sends");
mi.Invoke(o, ol);

}

这里我们使用到了一个assembly类 这个类可以用来加载一个程序集 这里我们加载的是Model这个私有程序集,如果要加在GAC中的公有程序集 还需要加上 程序集的版本号,公钥,和文化信息这里我们是加载的私有程序集所以直接就是程序集的友好名称,注意这里我们引用了Io 因为如果读不到Dll我们需要捕获异常,如果创建成功 我们就获得Model里面的jobs 这个类 然后我们使用了Activator类 用它的CreateInstance()方法来创建了一个Jobs的实例 使用Getmethot()的方法来获得jobs的方法使用Invoke 来调用方法 方法的第一个参数是 实例 第二个参数是 实例方法的输入参数使用的object数组 如果方法没有参数则写null 然后让我们来运行一下这个程序

 

没错这个方法被我们调用了 但是注意我们没有在引用里面添加Model这个程序集,所以在程序编译完成后程序集清单里面也没有model这个程序集,只有在程序运行的时候才加载了这个程序集然后调用的方法。最后要注意Model.DLL这个文件要放到bin目录下 因为.NET 寻找程序集是一种所谓探测技术,这不是我们说的重点。呵呵 今天就说到这里吧。

 

转载请注明文章出处:www.cnblogs.com/xylasp