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

发布于 2024-07-12 06:05:46 字数 166 浏览 7 评论 0原文

创建上述类型的类的对象

string myClass = "MyClass";

,然后调用

string myMethod = "MyMethod";

On 该对象的代码看起来如何?

How does the code looks that would create an object of class:

string myClass = "MyClass";

Of the above type, and then call

string myMethod = "MyMethod";

On that object?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

眼中杀气 2024-07-19 06:05:46

Example上的方法,但没有错误检查:

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

Example, but with no error checking:

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");
        }
    }
}

Each step needs careful checking - you may not find the type, it may not have a parameterless constructor, you may not find the method, you may invoke it with the wrong argument types.

One thing to note: Type.GetType(string) needs the assembly-qualified name of the type unless it's in the currently executing assembly or mscorlib.

傾旎 2024-07-19 06:05:46

我创建了一个使用 .NET 简化动态对象创建和调用的库,您可以在 google code 中下载该库和代码: 后期绑定助手
在项目中,您将找到一个包含用法的 Wiki 页面,或者您也可以另请检查此 CodeProject 中的文章

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

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

或者更短:

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

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

I've created a library which simplifies dynamic object creation and invocation using .NET you can download the library and the code in google code: Late Binding Helper
In the project you will find a Wiki page with the usage, or you can also check this article in CodeProject

Using my library, your example will look like this:

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

Or even shorter:

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

It uses a fluent interface, and truly simplifies this kind of operations. I hope you could find it useful.

梦中楼上月下 2024-07-19 06:05:46

下面假设一个对象具有公共构造函数和公共方法,该方法返回一些值但不带参数。

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

The following assumes an object with a public constructor and a public method that returns some value but takes no parameters.

var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
宁愿没拥抱 2024-07-19 06:05:46

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

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

Assuming that your class is in your executing assembly, your constructor and your method is parameterless.

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 */
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文