Hey Niels,
On Sun, May 23, 2010 at 7:59 PM, Niels <[email protected]> wrote:
> public static Tdestination InvokeHandler<Tsource,
> Tdestination>(Int32 signature, Tsource context)
All right.
> MethodDefinition invokeMethodDefinition = FindInvokeHandlerMethod();
> MethodReference invokeMethodReference =
> property.DeclaringType.Module.Import(invokeMethodDefinition);
> invokeMethodReference.GenericParameters.Add(new
> GenericParameter("Tsource", attribute.DeclaringType));
> invokeMethodReference.GenericParameters.Add(new
> GenericParameter("Tdestination", attribute.Property.PropertyType));
>
> But this doesn't seem to have the desired effect, the code results in
> the following IL instruction:
>
> L_0012: call !!1 [Common]Common.LazyLoad::InvokeHandler(int32, !!0)
>
> But the it should:
>
> L_0015: call !!1 [Common]Common.LazyLoad::InvokeHandler<class
> BusinessEntities.Contact, class
> BusinessEntities.EmailAddress>(int32, !!0)
>
> What am I doing wrong ? how can I supply the to generic types ?
So, the issue here, is that you're adding types to the
GenericParameters collections. The GenericParameters collection holds
the definition of the generic parameters.
For instance, in:
> public static Tdestination InvokeHandler<Tsource,
> Tdestination>(Int32 signature, Tsource context)
InvokeHandler has two generic parameters.
But InvokeHandler<int, string> should be a GenericInstanceMethod, that
has two generic arguments, int, and string.
So, if you have:
> MethodDefinition invokeMethodDefinition = FindInvokeHandlerMethod();
> MethodReference invokeMethodReference =
> property.DeclaringType.Module.Import(invokeMethodDefinition);
Then invokeMethodReference should already have 2 GenericParameters,
Tsource, and Tdestination. Then you have to instantiate it:
var invokeMethodReferenceInstance = new GenericInstanceMethod
(invokeMethodReference);
invokeMethodReferenceInstance.GenericArguments.Add (...);
invokeMethodReferenceInstance.GenericArguments.Add (...);
Where ... are the TypeReference to BusinessEntities.Contact and to
BusinessEntities.EmailAddress.
Then just pass invokeMethodReferenceInstance as an operand to the
call, and you're all set.
--
Jb Evain <[email protected]>
--
--
mono-cecil