2

クラスのオブジェクトを作成するコードはどのように見えますか:

string myClass = "MyClass";

上記のタイプの、そして呼び出し

string myMethod = "MyMethod";

そのオブジェクトで?

4

4 に答える 4

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 にない限り、型のアセンブリ修飾名を必要とします。

于 2009-01-27T12:31:54.690 に答える
3

.NET を使用して動的オブジェクトの作成と呼び出しを簡素化するライブラリを作成しました。ライブラリとコードを Google コードでダウンロードできます: Late Binding Helperプロジェクトでは、使用法を含む Wiki ページを 見つけるか、これを確認することもできます。CodeProject の記事

私のライブラリを使用すると、例は次のようになります。

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

またはさらに短い:

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

流暢なインターフェースを使用し、この種の操作を本当に簡素化します。お役に立てば幸いです。

于 2009-01-27T17:30:47.207 に答える
2

以下は、何らかの値を返すがパラメーターをとらない public コンストラクターと public メソッドを持つオブジェクトを想定しています。

var object = Activator.CreateInstance( "MyClass" );
var result = object.GetType().GetMethod( "MyMethod" ).Invoke( object, null );
于 2009-01-27T12:32:03.380 に答える
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 */
于 2009-01-27T12:34:40.270 に答える