2009-09-06 2 views
2

클래스 A의 단일 매개 변수 인스턴스를 받아들이고 B의 전달 된 인스턴스에서 메서드 B를 실행하는 일부 메서드를 동적으로 만들고 싶습니다. B에 int 유형의 매개 변수가 있습니다. 여기Reflection.Emit 동적으로 메소드를 만들려면

dynamicMethod(A a){ 
a.B(12); 
} 

내가 뭘하려 : 그래서 여기 스키마입니다

DynamicMethod method = new DynamicMethod(string.Empty, typeof(void), new[] { typeof(A) }, typeof(Program)); 
MethodInfo methodB = typeof(A).GetMethod("B", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null); 
ILGenerator gen = method.GetILGenerator(); 

gen.Emit(OpCodes.Nop); 
gen.Emit(OpCodes.Ldarg_0); 
gen.Emit(OpCodes.Ldarg_S, 100); 
gen.Emit(OpCodes.Call, methodB); 

는 그러나 컴파일러는 CLR이 방법을 발견하지 않는다는 것을 알려줍니다. 그걸 도와 줄 수 있니?

+1

'System.Linq.Expressions'를 사용하여 표현식 트리를 대신 컴파일 할 수 있습니다. 쉽습니다. –

답변

1

MSDN에 대한 the types parameter of the Type.GetMethod function : 방법이 취득하는 매개 변수의 개수, 순서 및 형식을 나타내는 Type 객체의

배열입니다.

"매개 변수를 사용하지 않는 메서드"를 나타내는 빈 배열을 전달합니다. 그러나 당신이 말했듯이 "B는 int 형의 매개 변수를 가지고 있습니다."

이 작동합니다 :

MethodInfo methodB = typeof(A).GetMethod(
      "B", 
      BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, 
      null, 
      new Type[] { typeof(int) } 
      , null); 

Ldarg_S이 Ldarg_0에와 비슷하게, 당신의 방법의 백분의 일 개 인수를로드 만약 내가 제대로 이해 :

gen.Emit(OpCodes.Ldarg_S, 100); 

을 상수 값 사용을 로딩 Ldc_I4

gen.Emit(OpCodes.Ldc_I4, 100); 
+0

예, 맞습니다. 그러나 Emit 메서드를 통해이 매개 변수를 전달하는 방법은 무엇입니까? 어떤 오피 코드를 사용해야합니까? –