如何在.NET 3.5中进行动态对象创建和方法调用
代码看起来如何创建类的对象:
string myClass = "MyClass";
以上类型,然后调用
string myMethod = "MyMethod";
那个对象?
- 使用
Type.GetType(string)
获取类型对象。 - 使用
Activator.CreateInstance(Type)
创建实例。 - 使用
Type.GetMethod(string)
检索方法。 - 使用
MethodBase.Invoke(object, object[])
来调用对象上的方法
示例,但没有错误检查:
using System; using System.Reflection; namespace Foo { class Test { static void Main() { Type type = Type.GetType("Foo.MyClass"); object instance = Activator.CreateInstance(type); MethodInfo method = type.GetMethod("MyMethod"); method.Invoke(instance, null); } } class MyClass { public void MyMethod() { Console.WriteLine("In MyClass.MyMethod"); } } }
每一步都需要仔细检查 – 你可能找不到类型,它可能没有无参数构造函数,你可能找不到方法,你可能会用错误的参数类型调用它。
有一点需要注意:Type.GetType(string)需要类型的程序集限定名称,除非它在当前正在执行的程序集或mscorlib中。
我已经创建了一个库,它使用.NET简化了动态对象的创建和调用,你可以下载库和谷歌代码中的代码: Late Binding Helper在项目中你会找到一个带有用法的Wiki页面 ,或者你也可以查看这个CodeProject中的文章
使用我的库,您的示例将如下所示:
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass"); myClass.Method("MyMethod").Invoke();
甚至更短:
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass") .Method("MyMethod") .Invoke();
它使用流畅的界面,真正简化了这种操作。 我希望你能发现它很有用。
下面假设一个对象具有公共构造函数和公共方法,该方法返回一些值但不带参数。
var object = Activator.CreateInstance( "MyClass" ); var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
假设您的类在执行程序集中,您的构造函数和方法是无参数的。
Type clazz = System.Reflection.Assembly.GetExecutingAssembly().GetType("MyClass"); System.Reflection.ConstructorInfo ci = clazz.GetConstructor(new Type[] { }); object instance = ci.Invoke(null); /* Send parameters instead of null here */ System.Reflection.MethodInfo mi = clazz.GetMethod("MyMethod"); mi.Invoke(instance, null); /* Send parameters instead of null here */