クラスのオブジェクトを作成するコードはどのように見えますか:
string myClass = "MyClass";
上記のタイプの、そして呼び出し
string myMethod = "MyMethod";
そのオブジェクトで?
クラスのオブジェクトを作成するコードはどのように見えますか:
string myClass = "MyClass";
上記のタイプの、そして呼び出し
string myMethod = "MyMethod";
そのオブジェクトで?
Type.GetType(string)
型オブジェクトを取得するために使用します。Activator.CreateInstance(Type)
します。Type.GetMethod(string)
メソッドを取得するために使用します。MethodBase.Invoke(object, object[])
オブジェクトでメソッドを呼び出すために使用します例ですが、エラーチェックはありません:
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 を使用して動的オブジェクトの作成と呼び出しを簡素化するライブラリを作成しました。ライブラリとコードを Google コードでダウンロードできます: Late Binding Helperプロジェクトでは、使用法を含む Wiki ページを 見つけるか、これを確認することもできます。CodeProject の記事
私のライブラリを使用すると、例は次のようになります。
IOperationInvoker myClass = BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass");
myClass.Method("MyMethod").Invoke();
またはさらに短い:
BindingFactory.CreateObjectBinding("MyClassAssembly", "MyClass")
.Method("MyMethod")
.Invoke();
流暢なインターフェースを使用し、この種の操作を本当に簡素化します。お役に立てば幸いです。
以下は、何らかの値を返すがパラメーターをとらない public コンストラクターと public メソッドを持つオブジェクトを想定しています。
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 */