如何在.NET 3.5中进行动态对象创建和方法调用

时间:2009-01-27 12:26:44

标签: c# .net dynamic clr invocation

代码看起来如何创建类的对象:

string myClass = "MyClass";

在上面的类型中,然后调用

string myMethod = "MyMethod";

关于那个对象?

4 个答案:

答案 0 :(得分:10)

示例,但没有错误检查:

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中。

答案 1 :(得分:3)

我已经创建了一个库,它使用.NET简化了动态对象的创建和调用,您可以在谷歌代码中下载库和代码:Late Binding Helper 在项目中,您会找到Wiki page with the usage,或者您也可以查看此article in CodeProject

使用我的库,您的示例将如下所示:

IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();

甚至更短:

BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
     .Method("MyMethod")
     .Invoke();

它使用流畅的界面,真正简化了这种操作。我希望你能发现它很有用。

答案 2 :(得分:2)

以下假设一个带有公共构造函数的对象和一个返回某个值但不带参数的公共方法。

var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );

答案 3 :(得分:0)

假设您的类在执行程序集中,您的构造函数和方法是无参数的。

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 */