2016-05-12 16 views
3

Ich habe eine Klassedie generische Methode auf einer statischen Klasse

public static class MyClass 
{ 

    public static T MyMethod<T>(T item) where T : ISomeInterface<T>, new 
    { 
     return MyMethod(new[] { item}).First(); 
    } 

    public static IEnumerable<T> MyMethod<T>(params T[] items) where T : ISomeInterface<T>, new 
    { 
     // for simplicity 
     return items.ToList(); 
    } 
} 

und eine Reihe von noch komplexeren Überlastungen. Jetzt möchte ich die Klasse erweitern (weil ich, wenn von Powershell nennen wollen) mit

public static IEnumerable MyMethod(string typeName, params object[] items) 
    { 
     var type = Type.GetType(typeName, true, true); 
     var paramTypes = new Type[] { type.MakeArrayType() }; 
     var method = typeof(MyClass).GetMethod(
      "MyMethod", BindingFlags.Public | BindingFlags.Static 
       | BindingFlags.IgnoreCase, null, paramTypes, null); 
     return method.Invoke(null, new object[] { items }); 
    } 

Aber method ist immer null. Welches ist der richtige Weg, um meine spezifische Methode über GetMethod() zu erhalten.

+1

Was ist die 'table' Variable? Meinst du stattdessen 'typeName'? –

+0

Sind diese Methoden Instanzmethoden oder statische Methoden? –

+0

'kann Instanzmitglieder in einer statischen Klasse nicht deklarieren'. –

Antwort

2

Ich glaube nicht, dass Sie GetMethod verwenden können, um nach einer generischen Methode zu suchen (ich bin mir aber nicht sicher). Sie können jedoch GetMethods verwenden, um alle Methoden zu erhalten und sich dann wie folgt filtern:

var method = typeof (MyClass) 
    .GetMethods(
     BindingFlags.Public | BindingFlags.Static) 
    .Single(x => x.Name == "MyMethod" 
     && x.IsGenericMethod 
     && x.ReturnType == typeof(IEnumerable<>) 
          .MakeGenericType(x.GetGenericArguments()[0])); 

Bitte beachten Sie, dass die letzte Bedingung ist die Überprüfung, dass der Rückgabetyp der Methode ist IEnumerable<T> so, dass wir nicht die Methode bekommen das gibt stattdessen T zurück.

Bitte beachten Sie, dass Sie die Variable method als statische Variable zwischenspeichern können, so dass Sie nicht jedes Mal suchen müssen.

Bitte beachten Sie, dass die zurückgegebene Methode noch offen ist (Es ist immer noch MyMethod<T>). Sie müssen noch durch den Aufruf MakeGenericMethod auf der Methode, wie diese eine geschlossene Version erstellen:

var closed_method = method.MakeGenericMethod(type); 

Sie können dann rufen Sie es wie folgt aus:

return (IEnumerable)closed_method.Invoke(null, new object[] { items }); 
+0

Ich schlage vor, LINQs Single-Methode anstelle von First zu verwenden, vor allem in einem Reflektionskontext wie diesem. – thehennyy

+0

@thehennyy, rechts. Wir wollen scheitern, wenn es mehrere Methoden mit denselben Kriterien gibt. –

Verwandte Themen