2011-12-17 21 views
1

これまで1時間、VB.NETで動的メソッドを使用して呼び出し元クラス内のサブを呼び出そうとしていました。VB.NETで動的メソッド内のメソッドを呼び出す

私はいくつかのことで運がなかった。まず、MSDN(http://msdn.microsoft.com/en-us/library/ms228971.aspx)のサンプルに従おうとしている間、私はメソッドをSubにできず、何も返さない他のメソッドを呼びたいだけです。

例えば、事がある

Private Sub FirstMethod() 

    Dim methodArgs As Type() = {} 
    Dim MyNewMethod As New DynamicMethod("MyNewMethod", Nothing, methodArgs, GetType(Crux).Module) 
    Dim il As ILGenerator = MyNewMethod.GetILGenerator() 
    il.Emit(OpCodes.Call, OtherMethod) 
    il.Emit(OpCodes.Ret) 
End Sub 

Private Sub OtherMethod() 
    MsgBox("This is some other method!") 
End Sub 

、私はそれが何かを返すようにしたくないと私はちょうどそれが()OtherMethodを呼び出したいと私は(代理人を介して)私のコードで動的メソッドを呼び出す方法をしたいと思います。 MSDNはまったく役に立たなかったし、私が望むことをやり遂げる方法を説明しようとするものも見つからない。

ご協力いただきまして誠にありがとうございます。

答えて

1

linq式を使用してデリゲートにコンパイルしてみてください。 古いfashion.emitよりも簡単です。

class Demo { 
    public void Foo() { 
     var instance = new Demo(); 
     var method = Expression.Call(Expression.Constant(instance), instance.GetType().GetMethod("Bar")); 
     var del = Expression.Lambda(method).Compile(); 
     del.DynamicInvoke(); 
    } 

    public void Bar() { 
     Console.WriteLine("Bar"); 
    } 
} 
0

DynamicMethodについて動的にメソッドを呼び出し、それは実行時に完全なメソッド本体を構築するのように、方法の構築に関する動的です本当にありません。

メソッドを呼び出す場合は、すでに持っているMethodInfoのメソッドInvokeを使用するだけです。引数なしのvoidメソッドのためのどちらが、あなたがDelegateでそれをカプセル化したい場合、あなたは私がデリゲートの種類としてアクションを選択した

var action = (Action) Delegate.CreateDelegate(typeof(Action), this, "OtherMethod"); 

action(); // call this.OtherMethod() 

を使用すると思い、今単に

var type = this.GetType(); 
var method = type.GetMethod("OtherMethod"); 
... 
method.Invoke(this, null); // call this.OtherMethod() 

ですここでは互換性のあるデリゲート型を使用できます。

MethodInfo取るオーバーロードなど、ここであなたを助けることができるDelegate.CreateDelegateのいくつかのオーバーロード、ありますので、あなたが望むタイプのデリゲートを作るために右の方法情報、およびコールCreateDelegateを取得するためにリフレクションを使用することができます。


呼び出したいメソッドはコンパイル時に知られている場合は、あなたが全体の反射事をスキップし、コンパイラはあなたのために仕事をさせることができマインド:

Action action = this.OtherMethod; // using a so-called method group 
Action action =() => this.OtherMethod(); // using a lambda 
Action action = delegate { this.OtherMethod(); } // using an anonymous method 
関連する問題