J'ai une classe qui veut un IList<T>
mais j'ai un Systems.Collection.IList
provenant d'une requête NHibernate.
Je veux créer une méthode qui le convertit en un fichier de type IList<T>
. Comment dois-je m'y prendre ?
J'ai une classe qui veut un IList<T>
mais j'ai un Systems.Collection.IList
provenant d'une requête NHibernate.
Je veux créer une méthode qui le convertit en un fichier de type IList<T>
. Comment dois-je m'y prendre ?
Si vous êtes sûr que tous les éléments héritent de T (ou de n'importe quel type que vous utilisez)
IList<T> myList = nonGenericList.Cast<T>().ToList();
Si vous n'êtes pas sûr :
IList<T> myList = nonGenericList.OfType<T>().ToList();
Bien entendu, vous aurez besoin de l'espace de noms System.Linq :
using System.Linq;
Cast
et OfType
retourner IEnumerable<T>
les mises en œuvre, et non IList<T>
implémentations, donc ils ne vous seraient pas utiles.
Appel . Cast<T>().ToList
entraînera une copie supplémentaire de la liste, ce qui peut avoir des conséquences négatives sur les performances.
Une meilleure approche (IMHO) serait de créer une classe enveloppe et de faire la conversion à la volée. Vous voulez quelque chose comme ceci :
class ListWrapper<T> : IList<T>
{
private IList m_wrapped;
//implement all the IList<T> methods ontop of m_wrapped, doing casts
//or throwing not supported exceptions where appropriate.
//You can implement 'GetEnumerator()' using iterators. See the docs for
//yield return for details
}
Cela aura l'avantage de ne pas créer une autre copie de la liste entière.
Fredrick a raison. Mais Nhibernate a aussi une option pour retourner plusieurs ensembles de résultats. Par exemple :
IList multiResults = session.CreateMultiCriteria()
.Add(pageCriteria)
.Add(countCriteria)
.List();
Dans l'appel ci-dessus, il n'y a pas d'option pour retourner une liste tapée. Donc, il doit être casté comme mentionné ci-dessus, comme ceci :
IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
IList counts = (IList)multiResults[1];
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.