2012-07-19 12 views
17

Supponendo che esista una classe X come descritto di seguito, come posso ottenere le informazioni sul metodo per il metodo non generico? Il seguente codice genererà un'eccezione.Come faccio a distinguere tra firme generiche e non generiche utilizzando GetMethod in .NET?

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"); 
    } 
} 

risposta

24

Non utilizzare GetMethod, utilizzare GetMethods, quindi controllare 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"); 
    } 
} 

Come bonus - un metodo di estensione:

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); 
    } 
} 

Poi basta:

static void Main(string[] args) 
{ 
    MethodInfo generic = Type.GetType("X").GetMethod("Y", true); 
    MethodInfo nonGeneric = Type.GetType("X").GetMethod("Y", false); 
} 
+0

Sono sorpreso questo non fa parte di NET per impostazione predefinita. – marsze

Problemi correlati