2011-12-17 5 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 표현식을 사용하고 위임자로 컴파일하려고하는 이유는 무엇입니까? 이전 패션 리플렉션보다 쉽습니다. DynamicMethod 정말 약 동적으로 메소드를 호출하지 않는

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

, 그것은 약 동적으로 런타임에 완벽한 메소드 본문을 구성 같이 방법을 구축합니다.

메소드를 호출하려는 경우 이미 가지고있는 MethodInfo에서 Invoke 메소드를 사용할 수 있습니다. 인수없이 무효 방법에 대한 어떤, 당신은 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