2016-12-08 2 views
1

Ich versuche, eine statische Klassenmethode über Reflexion zu rufen und ihren Rückgabewert erhalten wie folgt:eine statische Methode einer Klasse aufrufen Reflexion mit

private SA GetData() 
{ 
    Type type = Type.GetType("SA010"); 

    Object obj = Activator.CreateInstance(type); 

    MethodInfo methodInfo = type.GetMethod("GetSA"); 

    return (SA)methodInfo.Invoke(obj, null); 
} 

Hier ist die Klasse und Methode, die ich nennen werde:

public class SA010 
{ 
    public static SA GetSA() 
    { 
     //do stuff 
     return SA. 
    } 
} 

Das Problem ist, ich erhalte eine Null-Referenz Ausnahme für die Variable 'Typ'. GetData() und SA010.GetSA() befinden sich in demselben Namespace.

Irgendwelche Ideen, warum ich diesen Fehler bekommen könnte, etwas damit zu tun, vielleicht statisch zu sein?

+1

Erstens zu verwenden, warum Sie eine * Instanz erstellen *, wenn Sie zu nennen sind versuchen eine statische Methode? Sie sollten "null" als erstes Argument für "Invoke" übergeben. Das Problem ist jedoch, dass 'Type.GetType()' den Namespace-qualifizierten Namen benötigt. Sie wollen also 'Type.GetType (" My.Namespace.SA10 ")'. Wenn 'SA10' in einer anderen * Assembly * ist (was nicht dasselbe Konzept wie der Namespace ist), müssen Sie dies ebenfalls angeben. –

+0

@stuartd: Kein Problem: "Die Suche umfasst öffentliche statische und öffentliche Instanzmethoden." –

+1

Wenn Sie sowohl den Typ als auch den Methodennamen fest codieren, warum verwenden Sie überhaupt Reflektion? Erhält Ihr realer Code beide dynamisch? Wenn ja, können Sie den Aufrufer so ändern, dass der vollständig qualifizierte Typname übergeben wird? –

Antwort

6

Ihr Hauptproblem besteht darin, dass Sie bei Verwendung von GetType den vollständigen Namespace von SA010 angeben müssen.

Type type = Type.GetType("SomeNamespace.SA010"); 

Allerdings, wenn Sie nicht dynamicly erzeugen den Namen eine einfachere Lösung verwenden typeof ist dies erforderlich, dass Sie sich nicht auf ganze den Namespace, wenn der Typ ist bereits im Anwendungsbereich.

Type type = typeof(SA010); 

2. Ausgabe, die Sie in ausführen, sobald Sie den Typen zu beheben, wenn eine Methode statisch ist, dass Sie nicht über eine Instanz davon erstellen, übergeben Sie nur null in die Instanz für den Invoke Anruf.

private SA GetData() 
{ 
    Type type = typeof(SA010); 

    MethodInfo methodInfo = type.GetMethod("GetSA"); 

    return (SA)methodInfo.Invoke(null, null); 
} 
+0

Während ich dem zustimme, haben Sie das Problem vermisst, das das OP tatsächlich gemeldet hat - "type" ist null, und Ihr Code wird damit nicht helfen. –

+0

Refresh, es ist behoben –

+0

Nun, das erste Snippet ist nicht - gegeben, dass das ist das * Haupt * -Problem der OP steht vor, ich persönlich würde dieses Problem zuerst ansprechen ... die "Sie brauchen keine Instanz" ist wirklich sekundär. –

0

Try

Type type = typeof(SA010); 

statt

Type type = Type.GetType("SA010"); 

es für mich gearbeitet

Verwandte Themen