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

C# 利用反射动态创建对象[转]

2009-07-11 09:48 441 查看
private void btnLoadForm_Click(object sender, System.EventArgs e)
{
Assembly assembly = Assembly.LoadFrom(@"e:\AutoFormFirstForm.dll");
Type type = assembly.GetType("FirstForm.Form1");
object obj = Activator.CreateInstance(type);
Form formToShow = (Form)obj;
formToShow.MdiParent = this;
formToShow.Show();
}

代码说明:
1)首先是通过Assembly.LoadFrom()来加载dll文件;
2)再通过GetType()来获得要创建的Form类对象的类型。注意,在GetType()方法的参数为类型的名字,为string类型,同时该名字应为类型的FullName,即:命名空间名.类名;
3)然后通过Activator.CreateInstance()方法创建该类型对象,返回object对象。
4)再将该对象强制转换为Form类型。
5)最后调用即可。

运行程序,单击按钮,结果如下:

using System;

namespace AutoObjectInterface
{
public interface IAutoObject
{
void Print(string s);
}
}

这个接口很简单,只是提供一个Print()方法而已。

然后将它编译为Dll文件,名为AutoObjectInterface。

2、创建自定义类对象:

新建一个“类库”项目,取名为AutoObject,添加前面创建的接口Dll引用:

using System;

namespace AutoObject
{
public class TestObject:AutoObjectInterface.IAutoObject
{
public TestObject()
{

}

public void Print(string s)
{
Console.WriteLine(s);
}
}
}

这个类实现了第一步创建的接口。注意,这里实现的接口不是直接写在该类中,而是独立的Dll。在这个类中,是添加了该接口的dll,然后再实现它。这就是前面说的使用接口的一点特殊性。为什么要这样,是因为后面动态加载时,也要引用该接口Dll。我们动态创建后的对象,正是转换为该接口对象。由于实际的类和动态创建的类都引用并实现了该接口Dll,因此它的转换才能成功。这正是实现的关键!

也许有人疑问:我们能否将接口就放在要创建的类中,然后实现它。编译成dll文件,然后动态加载该dll,同时也手动添加该dll。动态创建后的对象,再强制转换为这个接口类型,不可以吗?答案当然是否定的,为什么?别问我,我也不知道!总之,我现在讲的方法,才是通过反射动态创建自定义对象的不二法门!!

也许会有人说我太武断!如果你不信,去试试。如果用另外的方法能成功,我一定改正错误。至少现在我能这样武断。

言归正传。现在我们再将给类编译为dll。名为AutoObject.dll,放到e:\NewObject中。

3、利用反射动态创建该对象:

新建一个控制台项目,取名为StudyReflection,添加前面创建的接口Dll引用。代码如下:AutoObjectInterface.IAutoObject iObj = (AutoObjectInterface.IAutoObject)obj;

using System;
using System.Reflection;

namespace studyReflection
{
class Class1
{

// 应用程序的主入口点。
[STAThread]
static void Main(string[] args)
{
Assembly assembly = Assembly.LoadFrom(@"e:NewObjectAutoObject.dll");
Type type = assembly.GetType("AutoObject.TestObject");

object obj = Activator.CreateInstance(type);
AutoObjectInterface.IAutoObject iObj = (AutoObjectInterface.IAutoObject)obj;

iObj.Print("wayfarer");

Console.ReadLine();
}
}
}

说明:这个代码和前面创建.Net自身提供的对象差不多,关键的区别就是强制转换。因为是自定义对象,所以我们不知道转换为什么对象啊,所以要添加接口的引用。转换的时候就转换为接口的类型:

这样我们就可以通过接口对象实例来调用类对象的方法Print()了。运行后,一切OK。

结论:在通过反射动态创建对象时,一定要注意区别所创建对象的类型。如果是自定义对象,必须通过单独的接口,来进行类型的转换。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: