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

后端 未结 4 934
广开言路
广开言路 2021-01-06 23:52

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

string myClass = \"MyClass\";

Of the above type, and then call



        
相关标签:
4条回答
  • 2021-01-07 00:06

    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.

    0 讨论(0)
  • 2021-01-07 00:22
    • Use Type.GetType(string) to get the type object.
    • Use Activator.CreateInstance(Type) to create an instance.
    • Use Type.GetMethod(string) to retrieve a method.
    • Use MethodBase.Invoke(object, object[]) to invoke the method on the object

    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.

    0 讨论(0)
  • 2021-01-07 00:24

    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 );
    
    0 讨论(0)
  • 2021-01-07 00:33

    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 */
    
    0 讨论(0)
提交回复
热议问题