2010-12-29 5 views

Antwort

7
MethodInfo methodInfo = typeof(Class) 
          .GetMethods(
           BindingFlags.Public | BindingFlags.Static 
          ) 
          .Where(m => m.Name == "StaticMethod") 
          .Where(m => m.IsGenericMethod) 
          .Where(m => m.GetGenericArguments().Length == 1) 
          .Where(m => m.GetParameters().Length == 3) 
          .Where(m => 
           m.GetParameters()[0].ParameterType == 
            m.GetGenericArguments()[0] && 
           m.GetParameters()[1].ParameterType == 
            typeof(IInterface1) && 
           m.GetParameters()[2].ParameterType == 
            typeof(IEnumerable<IInterface2>) 
          ) 
          .Single(); 

Beachten Sie, dass dies dann folgen muss mit

methodInfo = methodInfo.MakeGenericMethod(new Type[] { typeof(ConcreteType) }); 

den Typ zu schließen, wo ConcreteType ist der Typ Sie T für den Typ-Parameter werden soll.

Ich gehe davon aus:

class Class { 
    public static void StaticMethod<T>(
     T arg1, 
     IInterface1 arg2, 
     IEnumerable<IInterface2> arg3 
    ) { } 
} 
+0

Funktioniert gut, danke! – Xam

0
Type[] types = new Type[]{typeof(ClassUsedForTypeArgument)}; 
var info = typeof(Class).getMethod("StaticMethod").MakeGenericMethod(types); 

"Info" enthält, was Sie wollen, wenn ich mich nicht irre.

Edit: Wenn Sie nur die generische Methode Info möchten, ohne es mit dem Argument Typ instanziieren, können Sie Folgendes tun.

var info = typeof(Class).getMethod("StaticMethod"); 
+2

Dieses 'AmbiguousMatchException' werfen, wenn die Methode überlastet ist. –

+1

Dies kann ausgelöst werden, wenn die Methode überlastet ist. – jason

Verwandte Themen