クラスとメソッド名を文字列として渡して、そのクラスのメソッドを呼び出す方法はありますか?.NETでクラスのメソッドを動的に呼び出す方法
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
おかげ
クラスとメソッド名を文字列として渡して、そのクラスのメソッドを呼び出す方法はありますか?.NETでクラスのメソッドを動的に呼び出す方法
void caller(string myclass, string mymethod){
// call myclass.mymethod();
}
おかげ
同様
あなたはreflectionを使用したいと思うでしょう。ここで
は簡単な例です:
using System;
using System.Reflection;
class Program
{
static void Main()
{
caller("Foo", "Bar");
}
static void caller(String myclass, String mymethod)
{
// Get a type from the string
Type type = Type.GetType(myclass);
// Create an instance of that type
Object obj = Activator.CreateInstance(type);
// Retrieve the method you are looking for
MethodInfo methodInfo = type.GetMethod(mymethod);
// Invoke the method on the instance we created above
methodInfo.Invoke(obj, null);
}
}
class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
は今、これはエラーチェックを欠いて、非常に単純な例であり、またタイプが別のアセンブリに住んでいるが、私が思う場合の対処のような大きな問題を無視しますこれは適切なトラックにあなたを設定する必要があります。
このような何か:
public object InvokeByName(string typeName, string methodName)
{
Type callType = Type.GetType(typeName);
return callType.InvokeMember(methodName,
BindingFlags.InvokeMethod | BindingFlags.Public,
null, null, null);
}
あなたは、あなたが本当に必要なものを特定するMSDNでType.InvokeMemberメソッドを呼び出すだけでなく、確認したい方法に応じて結合のフラグを変更する必要があります。
-1これはコンパイルされません。 –
あなたは正しい、私の謝罪です。省略できないメソッド引数を追加するように編集しました(C#4.0 where where thou):) –
この理由は何ですか?おそらく、リフレクションなしで、動的アセンブリロードを含めて、これを行うことができます。
アセンブリがロードされ、型名がアセンブリ修飾されている限り、あなたは金色です。 –
Hmm ... 'Type.GetType(myclass);でnullを返すようにあなたの例を見つける – pistacchio
これは、myclassを含むアセンブリがappdomainにまだロードされていないためです。呼び出し元からアセンブリ名を取得し、Assembly.LoadFromまたはアセンブリを最初にロードする多くのバリアントの1つを実行する必要があります。 – Will