创建类对象的代码看起来如何:
string myClass = "MyClass";
以上类型,然后调用
string myMethod = "MyMethod";
在那个物体上?
创建类对象的代码看起来如何:
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 简化动态对象创建和调用的库,您可以在 google 代码中下载该库和代码: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 */