[C#] Linq, Reflection, Collection & Generics

Encore moi, et oui.

Bref, je me demande s’il est possible de faire un cast d’un object en List de façon dynamique ? A savoir que le type de la List ne sera pas figé au même type, sachant que je veux faire du Linq sur cette DataSource.
L’objectif étant de généraliser le traitement quelque soit le format de la DataSource.

Exemple:

[code]List cols1 = new List();
List cols2 = new List();

Gridview myGrid = new Gridview();
myGrid.DataSource = cols1;

//------ dans une fonction générique que je mettrais autre part:
List cols = (List)myGrid.DataSource; // En fait, je ne veux pas la caster en object mais avec le bon type.

// Actuellement, j’essais de faire ceci:
Type objType = myGrid.DataSource.GetType().GetProperties()[2].PropertyType;
List cols = List myGrid.DataSource;

var query = from ds in cols where ds.xxxx select ds;[/code]

je ne vois pas comment faire mon cast ou alors, je suis trop ambitieux, toussa…

Au taff, j’utilises un bout de code qui ressemble a ca :

[code]IList ie = cmo.Parent as IList;
if (ie != null)
{
Type listType = ie.GetType();
if (listType.IsGenericType)
{
Type[] ta = listType.GetGenericArguments();

								// todo check this works with interfaces too
								if (ta.Length == 1 && (ta[0] == toAdd.GetType() || toAdd.GetType().BaseType == ta[0]))
									ie.Add(toAdd);
								else
									Logger.Warn("Generic Type doesn't complies with list type : " +
										(ta.Length == 1 ? (ta[0].Name + " was Expected") : ("Not a generic Type : " + listType.FullName)) +
									 	" -> " +
									 	toAdd.GetType() +
									 	" was supplied");
							}
						}[/code]

Ca marche pas trop mal et ca me permet de n’ajouter qu’a la bonne list les objets. IList est ton amie :smiley:

Je ne comprends pas trop ce que tu cherches à faire.

Si tu cherches à caster une liste, il existe l’extensions Cast() sur Linq qui permet de faire “comme si” les éléments de la liste étaient du type souhaité. Sauf que tu coup la validation du type se fait à l’exécution, et plus à la compilation.

Mais vu ton code, j’ai pas l’impression que tu souhaites avoir une vérification forte du typage.

Et je ne comprends pas trop pourquoi tu voudrais avoir une méthode générique pour quelque chose qui reste spécifique à chaque utilisation.

Pourquoi ne pas faire directement var maListe = (IList)myGrid.DataSource ?

Si tu veux l’exposer via une méthode générique, ça donnerait :

public IList<TTarget> ToTypedList<TTarget>() { return (IList<TTarget>)this.myGrid.DataSource; }

Mais j’ai vraiment du mal à trouver l’intérêt…

Je développe un UserControl (ascx) le plus générique possible pour notre framework ce qui me permettrait de le réutiliser dans n’importe quel projet qui nécessite l’affichage de données dans une Gridview. J’ai déjà toute la structure de générique et me reste juste ce cast pour effectuer un petit Filter à la voléee sur ma gridview via Linq. Et pour celà, je me base de la DataSource qui contient déjà les données.

Et vu qu’une List nécessite un typage fort définit avant la compilation, bah, je coince. Je testerai lundi la solution donnée ci-dessus.

Du coup, j’évite de toucher à du traitement spécifique.