2010-11-18 5 views
2

par là!Comment convertir un type en générique?

donnée est cette classe:

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

maintenant je veux créer cette classe:

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?! 
    } 
} 

aussi à mentionner:

  • il y a des surcharges de FooMethod à FooClass<TFoo>, mais je veux seulement donner l'accès à la surcharge mentionnée (la signature correspond - sauf paramterNames)
  • returnType object serait succifient
  • je ne peux pas faire FooMethod dans FooClass générique - il devrait être une interface "oldstyle", comme il sera utilisé de la réflexion code
+0

Do vous voulez convertir ou lancer? – Bobby

+0

@bobby ?? ... je veux exécuter la méthode :) ... coulée, la conversion faite ailleurs ... –

+0

Dans ce cas, j'ai complètement raté le sens de votre question, désolé. – Bobby

Répondre

6

Quelque chose comme:

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

cependant - cette réflexion peut être lente dans une boucle serrée; si vous faites cela beaucoup, je serais tenté d'inverser la dépendance, de sorte que le code générique appelle dans le code non générique:

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

(avec la mise en œuvre dans la version non générique)

+0

je sais sur le ralentissement :) il s'agit juste d'une interface en option, où le consommateur connaît le ralentissement –

+0

btw ... excellent :) merci! –

+0

ahh ... juste une autre question: est-ce que la réflexion supporte 'out'? –

Questions connexes