How do I distinguish between generic and non generic signatures using GetMethod in .NET?
.net, c#-4.0
Solution
Don't use `GetMethod`, use `GetMethods`, then check `IsGenericMethod`.
using System;
using System.Linq;
class Program
{
static void Main(string[] args)
{
var mi = Type.GetType("X").GetMethods().Where(method => method.Name == "Y");
Console.WriteLine(mi.First().Name + " generic? " + mi.First().IsGenericMethod);
Console.WriteLine(mi.Last().Name + " generic? " + mi.Last().IsGenericMethod);
}
}
class X
{
public void Y()
{
Console.WriteLine("I want this one");
}
public void Y<T>()
{
Console.WriteLine("Not this one");
}
}
As a bonus - an extension method:
public static class TypeExtensions
{
public static MethodInfo GetMethod(this Type type, string name, bool generic)
{
if (type == null)
{
throw new ArgumentNullException("type");
}
if (String.IsNullOrEmpty(name))
{
throw new ArgumentNullException("name");
}
return type.GetMethods()
.FirstOrDefault(method => method.Name == name & method.IsGenericMethod == generic);
}
}
Then just:
static void Main(string[] args)
{
MethodInfo generic = Type.GetType("X").GetMethod("Y", true);
MethodInfo nonGeneric = Type.GetType("X").GetMethod("Y", false);
}
Problem
Assuming there exist a class X as described below, how do I get method information for the non-generic method? The code below will throw an exception. ``` using System; class Program { static void Main(string[] args) { var mi = Type.GetType("X").GetMethod("Y"); // Ambiguous match found. Console.WriteLine(mi.ToString()); } } class X { public void Y() { Console.WriteLine("I want this one"); } public void Y<T>() { Console.WriteLine("Not this one"); } } ```