2009-07-13 17 views

答えて

26

同様

あなたは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"); 
    } 
} 

は今、これはエラーチェックを欠いて、非常に単純な例であり、またタイプが別のアセンブリに住んでいるが、私が思う場合の対処のような大きな問題を無視しますこれは適切なトラックにあなたを設定する必要があります。

+0

アセンブリがロードされ、型名がアセンブリ修飾されている限り、あなたは金色です。 –

+0

Hmm ... 'Type.GetType(myclass);でnullを返すようにあなたの例を見つける – pistacchio

+1

これは、myclassを含むアセンブリがappdomainにまだロードされていないためです。呼び出し元からアセンブリ名を取得し、Assembly.LoadFromまたはアセンブリを最初にロードする多くのバリアントの1つを実行する必要があります。 – Will

8

このような何か:

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メソッドを呼び出すだけでなく、確認したい方法に応じて結合のフラグを変更する必要があります。

+0

-1これはコンパイルされません。 –

+1

あなたは正しい、私の謝罪です。省略できないメソッド引数を追加するように編集しました(C#4.0 where where thou):) –

-3

この理由は何ですか?おそらく、リフレクションなしで、動的アセンブリロードを含めて、これを行うことができます。

関連する問題