2012-03-26 2 views
2

일부 값으로 클래스 필드를 설정하는 동적 메서드를 내보내려고하고 일반 필드의 형식이 struct 인 경우 다음과 같이 새 구조체로 필드를 설정하고 싶습니다. var myStruct = new SomeStruct();.생성자가없는 새 구조체를 내보내는 방법

하지만 그 구조체의 기본 생성자를 찾을 수 없습니다.

var type  = valueForField.GetType  (); 

if(type.IsValueType && !type.IsPrimitive && !type.IsEnum) 
{ 
    emit 
     .ldarg_0 
     .newobj  (type.GetConstructor(Type.EmptyTypes)) 
     .stfld  (field); 

    continue; 
} 

그것은 라인 .newobj (type.GetConstructor(Type.EmptyTypes))에 실패하기 때문에 NEWOBJ 기능에 null을 전달

이 사람이 어떻게 생성자를 기본 통해 새로운 구조의 생성을 방출하는 방법을 말해 줄래?

답변

1

사용 MSDN에서 initobj

.ldarg_0 
.ldflda (field) 
.initobj (type) 

:

값 유형이 일반적으로 NEWOBJ를 사용하여 생성되지 않습니다. 그것들은 대개 인자 나 지역 변수로서 newarr (0부터 시작하는 1 차원 배열의 경우) 또는 객체의 필드로 할당됩니다. 일단 할당되면 Initobj를 사용하여 초기화됩니다.

0

Struct에는 실제 매개 변수가없는 생성자가있을 수 없습니다. 그들은 default(T)과 동등한 암시적인 디폴트 생성자를 가지고 있습니다. 그것은 default(T)의 IL 해당하는 것 같다

initobj

이 NEWOBJ 달리, initobj는 생성자 메서드를 호출하지 않습니다이다. Initobj는 값 유형을 초기화하기위한 것이고 newobj는 객체를 할당하고 초기화하는 데 사용됩니다.

+0

보조 메모와 마찬가지로 C#에서 매개 변수없는 생성자를 만들 수는 없지만 .NET에서는 첫 번째 문장이 틀림없이 정확하지 않을 수 있습니다. http://msmvps.com/blogs/jon_skeet/archive/2008/12/10/value-types-and-parameterless-constructors.aspx를 참조하십시오. – kvb