Freigeben über


GetMethod limitation regarding Generics

I've got several inquiry emails about this issue, so I think it is a good idea to publish the problem here.

Say we have:

public class Test

{
public void Teste<U>(U teste, int i) { Console.WriteLine(teste); }

   public void Teste<U> (U teste) { }

}

Is it possible to use GetMethod to get void Teste<U>(U teste, int i)out?

Unfortunately, the answer is there is no way for now to use only GetMethod to get the method before we know the type of U.  It is a limitation in Reflection for Whidbey.

Here is a possible workaround for you, you can use GetMembers to minimize the methodinfo you have to retrieve.

using System;
using System.Reflection;

public class Test
{
public void Teste<U>(U teste, int i) { Console.WriteLine(teste); }

    public void Teste<U> (U teste) { }

    public static void Main()
{

MemberInfo[] mis = typeof(Test).GetMember("Teste*", BindingFlags.InvokeMethod|BindingFlags.Public|BindingFlags.Instance);
if (mis.Length == 0) {Console.WriteLine("No Teste Methods"); return;}

        Type U = ((MethodInfo)mis[0]).GetGenericArguments()[0]; // assume we know the class structure above, for simplicity.
MethodInfo mInfo = typeof(Test).GetMethod("Teste", new Type[] { U, typeof(int) });

        if (mInfo.IsGenericMethod)
{
mInfo = mInfo.MakeGenericMethod(typeof(string));
mInfo.Invoke(new Test(), new object[] { "Test - calling generic method", 1 });
}
}
}

Comments

  • Anonymous
    September 14, 2005
    The comment has been removed