Использование Mono.Cecil, учитывая этот методСоздание Инструкция по типу
private Instruction LoadOnStack(MetadataType type, object value)
{
switch (type)
{
case MetadataType.String:
return _processor.Create(OpCodes.Ldstr, (string) value);
case MetadataType.Int32:
return _processor.Create(OpCodes.Ldc_I4, (Int32) value);
case MetadataType.Int64:
return _processor.Create(OpCodes.Ldc_I8, (Int64) value);
case MetadataType.Boolean:
return _processor.Create(OpCodes.Ldc_I4, (bool) value ? 1 : 0);
}
throw new NotSupportedException("Not a supported primitve parameter type: " + type);
}
Как я могу создать Instruction
, который может загружать value
, когда value
имеет тип Type
?
Я замечаю, когда value
имеет тип Type
, что я могу проверить это для него, как так:
if (value is TypeReference)
return _processor.Create(???, ???);
Но я не могу понять, что мне нужно, чтобы перейти к Create
, чтобы получить значение для правильной загрузки.
EDIT:
Используя это:
if (value is TypeReference)
return _processor.Create(OpCodes.Ldobj, type.Resolve());
Получает меня один шаг ближе. Кажется, он принимает тип. Но тогда, когда я пытаюсь написать сборку, это ошибка, говоря:
System.ArgumentException : Member 'System.Type' is declared in another module and needs to be imported
Я не знаком с тем, что доступно il; является отражением вариант? Вы могли бы искать '_processor' для метода' Create', второй аргумент которого имеет тип 'Type'? В качестве альтернативы, все может быть привязано к объекту ...? – object88
Вы пытаетесь загрузить экземпляр объекта типа 'Type' в стек? – cubrr
@ object88 Отражение в данном случае не является вариантом. И 'OpCodes' не имеют записи для' Type'. Я пробовал 'OpCodes.Ldobj',' OpCodes.Ldind_Ref' и еще несколько других, я не могу вспомнить – swestner