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。
结论:在通过反射动态创建对象时,一定要注意区别所创建对象的类型。如果是自定义对象,必须通过单独的接口,来进行类型的转换。
{
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。
结论:在通过反射动态创建对象时,一定要注意区别所创建对象的类型。如果是自定义对象,必须通过单独的接口,来进行类型的转换。
相关文章推荐
- C#利用反射动态创建对象
- C# 利用反射动态创建对象
- C# 利用反射动态创建对象
- 【转】C# 利用反射动态创建对象
- C#利用反射动态创建对象 带参数的构造函数和String类型
- C# 利用反射动态创建对象——带参数的构造函数和String类型
- C# 利用反射动态创建对象
- C# 利用反射动态创建对象
- C# 利用反射动态创建对象[摘录]
- C# 利用反射动态创建对象——带参数的构造函数和String类型
- C# 利用反射动态创建对象[摘录]
- C#利用反射动态创建对象 带参数的构造函数和String类型
- C#利用反射动态创建对象 带参数的构造函数和String类型 (转载)
- [C#] 利用反射动态创建对象
- C# 利用反射动态创建对象
- C# 利用反射动态创建对象
- C#回顾 - 8.利用反射动态创建对象
- 【C#反射-动态创建对象】
- C# 利用发射动态创建泛型类型的对象,泛型类型支持带惨的构造函数
- 【C#】利用反射机制创建对象