2009-03-08 2 views
1

Ich muss eine überladene Methode mit Reflektion aufrufen. Meine Klassen wie folgt:Invoke Generics überladen Methode mit Reflektion

GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public), 
    null, new Type[](){typeof(object[]),typeof(List<Type>}, null) 

Aber ich bin immer zweite Transform-Methode:

public static Transformer 
{ 
    //Overloaded method with generics parameter. First Transform Method 
    public static TranformerResult Transform<T>(object [] entities, 
     List<T> dataContract) where T:class 
    { 
     return transformerResult; 
    } 

    //Overloaded method without generics parameter. Second Transform Method 
    public static TranformerResult Transform(object entities, 
     Type dataContract) 
    { 
     return transformerResult; 
    } 
} 

public class TransformerResult 
{ 
    public List<T> GetTypes<T>() where T:class 
    { 
    } 
} 

Ich versuchte zunächst Methode mit folgenden Syntax-Transformation aufzurufen.

Meine Absicht ist GetType auf TransformerResult aufrufen. Das transformerResult ist ein Objekt, das den Aufruf der ersten Transformationsmethode zurückgibt.

Kann mir jemand helfen, den C# -Code zu schreiben, um meine Absicht zu erreichen?

Danke, Mahir

Antwort

1

Es sei denn, dies funktioniert: typeof(List<>) Sie ein bisschen schwierig mit zu sein brauchen werden, was Sie tun, ähnlich das, was ich zu tun hatte, mit diesem Beitrag: Im Wesentlichen http://www.aaron-powell.com/posts/2010-04-08-reflection-and-generics.html

Mit LINQ, um die Sammlung aller Transform Methoden zu durchsuchen, können Sie nicht nur die native zurückgeben.

+1

Der von Ihnen gepostete Link ist jetzt defekt. –

+0

@PeterO. Link ist behoben –

0

Ich denke, dass der zweite Typ in dem Array von Typen im Aufruf an GetMethod() Dinge verwirrend ist. Wenn Sie eine Instanz der Type Klasse der Klasse erhalten, die diese Methoden enthält, enthält sie nicht den tatsächlichen generischen Parameter, der zum Erstellen dieser Instanz der Klasse verwendet wird (die wie Type aussieht, basierend auf Ihrem zweiten Codebeispiel). Stattdessen weiß es nur, dass es einen generischen Parameter hat.

Ich habe derzeit keinen Compiler vor mir, also kann ich das leider nicht ausprobieren, aber ich würde versuchen, das Äquivalent von typeof(List<T>) für den zweiten Parameter anzugeben (Sie könnten das vielleicht auch bekommen) System.Collections.Generic.List.GetType() anrufen, aber ich bin nicht positiv).

Wenn das nicht funktioniert, ist die einzige andere Option, die ich denken kann, Type.GetMethods(BindingFlags.Static | BindingFlags.Public) anrufen, und durchsuchen Sie das Array selbst.

3

Der Grund, warum Sie auf ein Problem stoßen, ist, dass die bestimmte Methode, die Sie suchen, generisch ist. Einer der Typen der Methode basiert auf dem generischen Parameter der Methode. Dies stellt Sie mit einem kleinen Haken 22 dar. Der generische Parameter ist an die Methode gebunden, so dass Sie das Typarray für die Methode erst dann richtig konstruieren können, wenn Sie die Methode selbst haben.

Eine Lösung für dieses spezifische Szenario ist die erste gattungsgemäße Methode.

var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First();