2010-11-18 15 views
2

Hallo!Wie konvertiere ich vom Typ zum generischen?

gegeben ist diese Klasse:

public static class FooClass<TFoo> 
{ 
    public static TFoo FooMethod(object source) 
    { 
     // implementation goes here 
    } 
} 

jetzt will ich diese Klasse erstellen:

public static class FooClass 
{ 
    public static object FooMethod(object source, Type fooType) 
    { 
     var classType = typeof (FooClass<>).MakeGenericType(fooType); 
     var methodInfo = classType.GetMethod("FooMethod", new[] 
     { 
      typeof (object) 
     }); 
     // WHAT NOW?! 
    } 
} 

auch zu erwähnen:

  • gibt es Überlastungen von FooMethod in FooClass<TFoo>, aber Ich möchte nur Zugriff auf die erwähnte Überladung geben (Signatur passt - außer ParameterNames)
  • return object würde succifient
  • sein i nicht FooMethod in FooClass Generika machen kann - es sollte eine "Oldstyle" Schnittstelle sein, wie es aus der Reflexion-Code verwendet wird,
+0

Do Sie möchten es konvertieren oder umwandeln? – Bobby

+0

@bobby ?? ... Ich möchte die Methode ausführen :) ... Casting, Konvertierung woanders gemacht ... –

+0

In diesem Fall habe ich die Bedeutung Ihrer Frage komplett verpasst, tut mir leid. – Bobby

Antwort

6

Etwas wie:

public static class Foo 
{ 
    public static object FooMethod(object source, Type fooType) 
    { 
     return typeof(Foo<>).MakeGenericType(fooType) 
      .GetMethod("FooMethod").Invoke(null, new object[] { source }); 
    } 
} 

jedoch - diese Reflexion kann in einer engen Schleife langsam sein; wenn Sie diese viel tun, würde ich versucht sein, die Abhängigkeit rückgängig zu machen, so dass der generische Code ruft in den nicht-generic-Code:

public static class Foo<TFoo> 
{ 
    public static TFoo FooMethod(object source) 
    { 
     return (TFoo)Foo.FooMethod(source, typeof(TFoo)); 
    } 
} 

(bei der Umsetzung in der nicht-generischen Version)

+0

Ich weiß über die Verlangsamung :) es ist nur über eine optionale Schnittstelle, wo der Verbraucher über die Verlangsamung weiß –

+0

BTW ... ausgezeichnet :) danke! –

+0

ahh ... nur eine andere Frage: Unterstützt die Reflexion "out"? –

Verwandte Themen