Использование C # OpCodes для генерации метода, который возвращает объект - PullRequest
0 голосов
/ 07 марта 2012

Я создаю динамический тип, у которого есть метод, который я хотел бы вернуть объект.Я не понимаю, как этого добиться.Вот что у меня есть:

// .. stuff to create type builder



MethodBuilder builder =
                typeBuilder.DefineMethod(
                    method.Name,
                    MethodAttributes.Virtual | MethodAttributes.Public,
                    method.CallingConvention,
                    method.ReturnType,
                    typeArray1);
            builder.InitLocals = true;
ILGenerator gen = builder.GetILGenerator();
Object myObjectIdLikeToReturn = someMethodCall();
//gen.??(??????????) // here's where I'm lost
gen.Emit(OpCodes.Ldloc_0);
gen.Emit(OpCodes.Ret);

Я считаю, что если я правильно читаю msdn, мне нужно получить ссылку на myObjectIdLikeToReturn в стеке - однако мне не повезло.Кто-нибудь может указать мне правильное направление?

Редактировать: Чтобы сделать это более ясным.Я пытаюсь написать эквивалент в IL:

public virtual Object MyNewMethod() {
   return myObjectIdLikeToReturn;
}

1 Ответ

2 голосов
/ 07 марта 2012

У вас есть эта строка:

Object myObjectIdLikeToReturn = someMethodCall();

Вы говорите, что «хотите получить ссылку на myObjectIdLikeToReturn в стек».Но это невозможно.Я думаю, что вы путаете время, когда эти вещи происходят.Код генерации IL аналогичен компиляции - все должно быть известно статически.Принимая во внимание, что myObjectIdLikeToReturn - это переменная, которая существует во время генерации кода, но не имеет никакого значения для класса, который фактически генерируется.Вы не можете «вставить» ссылку на какой-то произвольный объект времени выполнения, идея просто не имеет никакого смысла.

Ваше единственное решение - каким-то образом заставить ваш IL выполнить вызов someMethodCall.Но, не зная больше о том, где этот метод живет и как он связан с вашим сгенерированным типом, сложно точно определить, как вы этого достигнете.

...