[Mono-devel-list] emitting a MethodInfo instance

Valient Gough valient at gmail.com
Mon May 30 17:47:32 EDT 2005

I have a MethodInfo instance that I would like to emit into IL code. 
Basically I need to emit a method call which takes a MethodInfo as an
argument, and the MethodInfo will be static when the IL code is
created.  Is there an easy way to emit a MethodInfo instance?

The method I need to provide looks like this:

void Emit_MethodInfo( ILGenerator ig, MethodInfo method )

It looks like it could be done by emitting code which looks something
like "typeof([type]).GetMethod([name], [args])", but that is
non-trivial and is not efficient:
            // typeof([type]).GetMethod([name], [args])
            ig.Emit( OpCodes.Ldtoken, method.DeclaringType );
            ig.EmitCall( OpCodes.Call, Type_GetTypeFromHandle, null );
            ig.Emit( OpCodes.Ldstr, method.Name );

            ParameterInfo[] parms = method.GetParameters();
            Type[] parTypes = new Type[parms.Length];
            for( int parN = 0; parN < parms.Length; ++parN)
                parTypes[parN] = parms[parN].ParameterType;

            // create an array to hold the types..
            Emit_LoadInt( ig, parTypes.Length );
            ig.Emit(OpCodes.Newarr, typeof(System.Type));

            for(int i=0; i<parTypes.Length; ++i)
                Emit_LoadInt( ig, i );
                Emit_GetTypeFromHandle( ig, parTypes[i] );

            ig.Emit( OpCodes.Call,
                        new Type[] { typeof(string), typeof(Type[]) }));

There must be a better way?


More information about the Mono-devel-list mailing list