2012-02-03 6 views
0

Reflection Emit 패키지를 사용하여 클래스를 생성해야하는 매우 복잡한 작업이 필요합니다. 이 클래스는 간단한 DTO이며 서비스를 정의하기 위해 WCF와 함께 사용됩니다. 간단합니다. 그러나 중첩 형식을 사용해야합니다.Reflection.Emit을 사용하여 중첩 유형을 만드는 방법은 무엇입니까?

현재 테스트가 작동하지 않습니다. 기본 유형을 만들 수 있지만 중첩 유형을 만들 수 없습니다.

var serviceClassBuilder = _module.DefineType("something", TypeAttributes.Public | TypeAttributes.Class); 

// Create a nested class that will hold the input definition 
var nested_type_builder = serviceClassBuilder.DefineNestedType(className, 
    TypeAttributes.NestedPublic | TypeAttributes.Class | 
    TypeAttributes.SequentialLayout); 

serviceClassBuilder.CreateType(); // <-- NOT WHAT I EXPECTED! 

생성 된 클래스에는 중첩 된 유형이 없습니다. 가능한가? 수업은 위와 같이 간단합니다. Emit 패키지의 몇 가지 제한 사항을 읽었지만, 필자가 사용했던 것과 같은 간단한 예제에 적용되는지 확신 할 수 없습니다.

nested_type_builder.CreateType(); 

는 내가 처음 빌더가 CreateType의 캐스케이드 실행을 했어야한다고 생각하더라도, 결국, 내가 전화 할 필요가 없습니다 :

나는 심지어 만드는 유형 전에 아래의 라인을 추가하는 시도 메서드를 만드는 데 필요한 것, 형식을 호스팅하는 어셈블리 등

답변

0

먼저 nested_type_builder.CreateType()에 전화해야한다고 생각하거나 예외가 발생합니다.

하지만 그렇게하면 이상하게 행동합니다. serviceClassBuilder.CreateType()에서 반환 된 Type은 적어도 GetNestedTypes()을 사용하여 볼 때 중첩 된 유형을 포함하지 않는 것으로 보입니다. 실제로 어셈블리를 디스크에 저장하고 보면 어셈블리는 정확히 중첩 된 형식을 포함합니다.

생성 된 어셈블리 파일로 작업해야하는 경우 괜찮습니다. 나는 TypeBuilder에 의해 반환 된 타입의 GetNestedTypes()의 동작이 버그라고 생각합니다.

+0

디스크에 저장하지 못했습니다. 나는 그것을 시도 할 것이다. 실행 중에 유형이 필요하지만 지금까지는 dll을 저장하고로드하는 데 아무런 문제가 없습니다. –

+0

Ow, 또 다른 한 가지 :'serviceClassBuilder.CreateType()'** 이전에'nested_type_builder.CreateType()'을 호출하지 않으면 ** 예외가 발생하지 않습니다. 내 추측은 그렇다. –

+0

이상하게도, 그것은 나를 위해 예외를 제기했다. – svick

관련 문제