Jan,

On Tue, Apr 20, 2010 at 1:34 PM, Jan <jan.blessen...@gmail.com> wrote:
> I only have a TypeReference, not the System.Type.

Ah ok, I thought you had as you used typeof. Nevermind then, we can
make it work too. What you have to emit in the end is this:

callvirt   instance !0 class BaseClass`1<int32>::GetKey()

But that's not hard. All you have to do is to get a MethodReference or
a MethodDefinition to the open GetKey method, and do something like:

TypeReference int32_ref = ...;
TypeReference open_base_class = ...;
MethodReference open_get_key = ...;

TypeReference base_class_of_int = open_base_class.MakeGenericType (int32_ref);

MethodReference get_key_on_base_class_of_int =
open_get_key.MakeGeneric (base_class_of_int);

And callvirt get_key_ob_base_class_of_int.

MakeGenericType would be defined as:

                public static TypeReference MakeGenericType (this TypeReference
self, params TypeReference [] arguments)
                {
                        if (self.GenericParameters.Count != arguments.Length)
                                throw new ArgumentException ();

                        var instance = new GenericInstanceType (self);
                        foreach (var argument in arguments)
                                instance.GenericArguments.Add (argument);

                        return instance;
                }

and MakeGeneric would be defined as:

                public static MethodReference MakeGeneric (this MethodReference
self, TypeReference declaringType)
                {
                        var reference = new MethodReference {
                                Name = self.Name,
                                DeclaringType = declaringType,
                                HasThis = self.HasThis,
                                ExplicitThis = self.ExplicitThis,
                                ReturnType = self.ReturnType,
                                CallingConvention = 
MethodCallingConvention.Generic,
                        };

                        foreach (var parameter in self.Parameters)
                                reference.Parameters.Add (new 
ParameterDefinition
(parameter.ParameterType));

                        foreach (var generic_parameter in 
self.GenericParameters)
                                reference.GenericParameters.Add (new 
GenericParameter (reference));

                        return reference;
                }


-- 
Jb Evain  <j...@nurv.fr>

-- 
--
mono-cecil

Subscription settings: http://groups.google.com/group/mono-cecil/subscribe?hl=en

Reply via email to