2015-01-06 9 views
0

Я строй динамического типа, который наследует от исходного типа, и я хотел бы сохранить первоначальный вид в его интерфейс:Присвоить значение переменного с IL MethodBuilder

public interface IInterface 
{ 
    Type OriginalType { get; } 
} 

Так что я могу используйте оригинал, когда мне нужно, вместо динамически созданного типа.

Как можно присвоить такое значение? Есть ли для этого конкретный OpCode или есть способ, чтобы класс «знал» его базовый класс во время строительства?

+1

Моя рекомендация будет первым сделать эквивалент того, что вы хотите, чтобы излучать в C#, а затем посмотреть на MSIL разборки для этого. –

+0

@ 500-InternalServerError Я не знаю, как, поэтому я спросил, есть ли способ назначить его определенным значением во время создания (как если бы я набрал базовый тип, который я не знаю во время компиляции). Если я набираю результат с помощью определенного типа, этот конкретный тип появляется в ILCode из ILDasm, который на самом деле не нужен мне ... – Danicco

+0

Вы действительно хотите сохранить объект 'System.Type' для того типа, который наследуется, или вы действительно хотите сохранить _instance_ этого типа? То есть, если бы вы определяли 'класс MyDynamicClass: MyBaseClass', было бы поле' _original' определено как 'Type _original' или как' MyBaseClass_original'? Хранение 'System.Type' кажется менее полезным, поэтому я спрашиваю. – Andrew

ответ

1

_original - это поле вашего сгенерированного типа.

Если вы хотите установить значение для этого поля, вам необходимо: this._original = myvalue; это эквивалентно ... ldarg_0 + [EmittedValue] + stfld (_original). в вас дело [EmittedValue] тип: ldtoken (тип) + вызов (Type.GetTypeFromHandle)

ldarg_0 //this 
ldtoken //typehandle 
call Type.GetTypeFromHandle //TypeHandle to Type 
stfld _original //setfield (must be follow ldarg_0 and value as Type) 
+0

_original - поле вашего сгенерированного типа. Если вы хотите установить значение для этого поля, вам необходимо: this._original = myvalue; это эквивалентно ... ldarg_0 + [EmittedValue] + stfld (_original). в вашем случае [EmittedValue] - это тип: ldtoken (type) + call (Type.GetTypeFromHandle) – Teter28