2011-04-06 6 views
0

permet de dire que j'ai une fonctionConver Type de classe à un argument générique

public void func1<T>(); 

Et une autre fonction:

public void func2(Type type); 

intérieur func2, je veux appeler func1 avec le type. Comment puis-je "convertir" le type afin qu'il puisse s'intégrer?

edit: Je n'ai pas pensé que cela aurait de l'importance, mais func1 n'est pas ma fonction. il fait partie du cadre:

context.CreateObjectSet<T>() 

Répondre

4

Vous ne pouvez pas appeler la fonction générique explicitement car vous ne connaissez pas le type lors de la compilation. Vous pouvez utiliser des réflexions pour appeler le func1 et spécifier votre type comme argument générique. Cependant je vous conseillerais de changer la signature des méthodes pour éviter d'utiliser des réflexions si possible.

Voici un exemple de la façon de le faire avec des réflexions:

private static void Method1(Type type) 
    { 
     MethodInfo methodInfo = typeof(Program).GetMethod("Method2", BindingFlags.NonPublic | BindingFlags.Static); 
     MethodInfo genericMethodInfo = methodInfo.MakeGenericMethod(type); 
     genericMethodInfo.Invoke(null, null); 
    } 

    private static void Method2<T>() 
    { 
     Console.WriteLine(typeof(T).FullName); 
    } 
+0

J'ai édité ma question, pouvez-vous modifier votre solution? –

+0

Pouvez-vous rendre votre func2 générique? Si ce n'est pas le cas, vous ne pouvez pas appeler func1 sans réflexions - vous ne connaissez pas le type qui sera transmis à func1 comme paramètre générique au moment de la compilation et les génériques sur la connaissance du type au moment de la compilation. –

1

Vous devez utiliser la réflexion.

public void func2(Type type) 
{ 
    // call func1<T>() 
    var thisType = this.GetType(); 
    var method = thisType.GetMethod("func1", new Type[0]).MakeGenericMethod(type); 
    method.Invoke(this, null); 
} 
0

Une autre option, bien sûr: vous pouvez tout simplement aller dans l'autre direction et faire la version Type la « vraie » un:

public T func1<T>() 
{ 
    func2(typeof(T)); 
} 

public object func2(Type type) 
{ 
    Console.WriteLine(type.FullName); 
} 

Ceci est similaire à la façon dont le cadre met en œuvre Enum.TryParse<TEnum> et Enum.TryParseEnum. L'implémentation du variant générique TEnum le transmet simplement (via typeof(TEnum)) à la méthode non générique (Type).

Questions connexes