Как создать новую структуру без конструкторов - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь вызвать динамический метод, который устанавливает поля класса по некоторым значениям, а когда типом регулярного поля является структура, я хочу установить поле с новой структурой, например: 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 ) ) из-за передачи значения null в newobj function

Может кто-нибудь сказать мне, как создать новую структуру через конструктор по умолчанию?

Ответы [ 2 ]

1 голос
/ 27 марта 2012

Использование initobj

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

Из MSDN:

Типы значений обычно не создаются с использованием newobj. Они обычно размещаются либо как аргументы, либо как локальные переменные, используя newarr (для основанных на нуле, одномерных массивов) или как поля объектов. После выделения они инициализируются с помощью Initobj.

0 голосов
/ 27 марта 2012

Struct s не может иметь реального конструктора без параметров.У них есть неявный конструктор по умолчанию, эквивалентный default(T).

Кажется, что эквивалент IL default(T) равен initobj

В отличие от Newobj, initobj не вызывает метод конструктора.Initobj предназначен для инициализации типов значений, а newobj используется для выделения и инициализации объектов.

...