2013-08-12 1 views
2

동적 배열을 동적 형식으로 생성하기 위해 Reflection.Emit 네임 스페이스의 형식을 사용하고 있습니다.Reflection.Emit을 사용하여 속성을 메서드로 내 보내야합니까?

Reflection과 Reflection.Emit 네임 스페이스는 모두 CLR 유형의 메서드 및 속성을 처리하기위한 API를 제공합니다.

제 지식에 따르면 속성은 C# 컴파일러에서 메서드로 구현되므로 동적으로 출력 할 때 어떻게 처리해야하는지 궁금합니다.

MethodBuilder을 사용하거나 PropertyBuilder을 사용하여 속성을 방출해야합니까? (DefineMethod 또는 DefineProperty이라고 부름)

다른 방법보다 한 가지 방법에 대한 권장 사항이 있습니까?

+1

PropertyBuilder.SetSetMethod 및 SetGetMethod()를 사용하는 것이 좋습니다. 그리고 네, MethodBuilder를 사용합니다. –

+0

@HansPassant, 분명히 대답입니까? * 당신의 무한한 지혜에 활 * : –

+0

이 질문에 더 많은 것이 있어야합니다, 나는 그것을 보지 못합니다. –

답변

4

MethodBuilder을 사용하거나 PropertyBuilder을 사용하여 속성을 방출해야합니까?

둘 다. 읽기/쓰기 속성이 X 인 경우 CIL에서 get 메서드 (일반적으로 get_X), 설정된 메서드 (일반적으로 set_X) 및 올바르게 두 메서드를 가리키는 X으로 표시됩니다. 그래서

, 당신은해야, Reflection.Emit를를 사용하여 속성을 만들려면 다음

  1. 사용 MethodBuilder는 get 메소드 (아마 필드에서 읽기를) 만들 수 있습니다.
  2. 또 다른 MethodBuilder을 사용하여 set 메소드를 만듭니다 (아마도 같은 필드에 쓰는 것입니다).
  3. PropertyBuilder을 사용하여 속성을 만들고 Name을 설정하고 SetGetMethod()SetSetMethod()을 호출하십시오.

읽기 전용 속성을 만들려면 2 단계를 건너 뛰고 GetSetMethod()을 호출하지 마십시오.

+0

그래서 CIL에는 속성에 대한 개념이 없습니까? 대답에 따르면, 두 속성을 함께 유지하는 두 가지 방법이 있습니다. –

+2

@ lysergic-acid 바로 그게 바로 그것입니다 : 각각의 접근 자에 대한 메소드와 메소드를 연결하는 속성. [CLI 스펙의 §II.17] (http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf#222)를 보길 원할 것입니다. do, 당신은'.other' 부분을 무시할 수 있습니다, AFAIK, C#에서는 사용되지 않습니다). – svick