2010-10-18 16 views
26

Ich habe eine generische MethodeAufruf generische Methode mit Typ Variable

Foo<T> 

Ich habe eine Art Variable bar

Ist es möglich, so etwas wie Foo<bar>

Visual Studio zu erreichen, ist eine Art erwartet oder Namensraum in der Leiste.

Güte,

Dan

+0

Können Sie Code anzeigen, wo Sie ihn verwenden möchten? Es ist definitiv möglich, daher ist es wahrscheinlich ein Syntaxfehler. – RPM1984

Antwort

34

Lassen Sie uns annehmen, dass Foo in class Test deklariert wird wie

public class Test 
{ 
    public void Foo<T>() { ... } 

} 

Sie müssen sich zuerst instanziieren Sie die Methode für Typ bar mit MakeGenericMethod. Und dann rufen Sie es mit Reflektion auf.

var mi = typeof(Test).GetMethod("Foo"); 
var fooRef = mi.MakeGenericMethod(bar); 
fooRef.Invoke(new Test(), null); 
+0

Danke schön ... genau das, was ich brauchte! –

3

Sie diese Art machen kann durch

typeof(Foo<>).MakeGenericType(bar); 
20

Wenn ich Ihre Frage richtig verstanden, Sie haben im Wesentlichen die folgenden Typen definiert:

public class Qaz 
{ 
    public void Foo<T>(T item) 
    { 
     Console.WriteLine(typeof(T).Name); 
    } 
} 

public class Bar { } 

Jetzt, da Sie haben eine Variable bar als solche definiert:

var bar = typeof(Bar); 

Sie möchten dann Foo<T> anrufen können und dabei T durch Ihre Instanzvariable bar ersetzen.

Hier ist, wie:

// Get the generic method `Foo` 
var fooMethod = typeof(Qaz).GetMethod("Foo"); 

// Make the non-generic method via the `MakeGenericMethod` reflection call. 
// Yes - this is confusing Microsoft!! 
var fooOfBarMethod = fooMethod.MakeGenericMethod(new[] { bar }); 

// Invoke the method just like a normal method. 
fooOfBarMethod.Invoke(new Qaz(), new object[] { new Bar() }); 

Viel Spaß!

+0

+1 ... nur etwas später als angenommen Antwort aber wunderbar! –

+3

@ Daniel Elliot - Ja, ich weiß - 41 Sekunden später. Ich hatte gehofft, dass sich meine etwas detailliertere Antwort durchsetzen würde, aber leider. ;-) – Enigmativity

+0

mein Code bekomme Arbeit, beste Antwort im Detail .... Danke –

Verwandte Themen