2012-02-24 2 views
4

Я пытаюсь воспроизвести следующий IL с помощью Mono.Cecil:Как создать тип возврата GenericParameter для метода Method в Mono.Cecil?

call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [System]System.ComponentModel.PropertyChangedEventHandler>(!!0&, !!0, !!0) 

Когда я использую Mono.Cecil, чтобы осмотреть этот IL, я вижу, что операнд команды является GenericInstanceMethod, который держит ElementMethod типа MethodReference. Этот методReference, в свою очередь, имеет тип возвращаемого типа GenericParameter.

Я хотел бы создать те же объекты вручную, но, похоже, поймать-22. Чтобы создать GenericParameter, мне нужен IGenericParameterOwner, который, по-видимому, является тем же самым методом MethodReference выше. Поэтому я хотел бы передать MethodReference в конструктор GenericParameter. Однако я не могу создать MethodReference без TypeReference для возвращаемого типа, который, как я полагаю, должен быть GenericParameter.

Как это разрешить? Что я недопонимаю?

ответ

4

Это, похоже, проблема с API как есть.

Простым способом обойти это было бы передать TypeReference для void как ReturnType вашего MethodReference и изменить ReturnType на более поздний созданный GenericParameter.

+0

А, значит, вы имеете в виду, что я мог бы сделать что-то подобное? 'var elementMethodRef = new MethodReference (" CompareExchange ", _voidTypeRef); var genParam = новый GenericParameter ("!! 0", elementMethodRef); elementMethodRef.ReturnType = genParam; ' – Einar

+0

@Einar yes, а затем elementMethodRef.GenericParameters.Add (genParam); –

+0

Замечательно, это был недостающий кусок! Благодаря! – Einar

Смежные вопросы