繁体   English   中英

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

[英]How to do dynamic object creation and method invocation in .NET 3.5

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

string myClass = "MyClass";

以上类型,然后调用

string myMethod = "MyMethod";

那个对象?

示例,但没有错误检查:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM