2010-01-20 4 views
15

J'ai une méthode FindAll sur mon DataAccessLayer qui ressemble à ceci:Puis-je transmettre un objet type à une méthode générique?

public FindResult<T> FindAll<T>() where T : Entity, new() 

et un code client qui a un tableau de type [] dont il a besoin d'utiliser pour appeler itérativement la méthode FindAll avec comme ceci:

foreach (var type in typeArray) 
{  
    var result = DataAccessLayer.FindAll<type>(); 
    ... 

mais le compilateur se plaint de "Type ou espace de noms attendu". Y at-il un moyen facile de contourner ce problème? J'ai essayé type.GetType() ou typeof (type) et aucun travaillé.

Merci beaucoup d'avance!

Répondre

13

Vous devrez peut-être utiliser la réflexion pour ce faire, quelque chose comme ceci:

DataAccessLayer.GetType().GetMethod("FindAll<>").MakeGenericMethod(type).Invoke() 

This blog post peut également contenir les informations dont vous avez besoin. Lors de l'utilisation de génériques, le type doit pouvoir être résolu au moment de la compilation.

+0

Est-ce parce que C# ne supporte pas le typage dynamique (j'ai entendu dire qu'il est supporté dans C# 4.0) que mon code original n'a pas fonctionné? – theburningmonk

+1

Je ne suis pas sûr si le support dynamique dans C# 4 vous permettrait de faire ceci d'une manière différente, puisque je ne sais pas comment vous pourriez fournir le type générique dynamique là non plus. Mais je ne l'ai pas essayé ... – Lucero

3

Vous essayez de fournir le type lors de l'exécution.

+0

ouais, je me suis rendu compte que maintenant, j'essayais d'utiliser le typage dynamique qui n'est pas supporté pour le moment, mais en lisant sur .Net 4.0, C# va introduire le support pour le typage dynamique peut-être que ce que j'essayais de faire sera possible dans un proche avenir! – theburningmonk

Questions connexes