Tengo una clase que quiere un IList<T>
, pero tengo un Systems.Collection.IList
, proveniente de una consulta de NHibernate.¿Cómo convierto un IList no genérico en IList <T>?
Quiero crear un método que lo convierta en IList<T>
. ¿Cómo hago esto?
Tengo una clase que quiere un IList<T>
, pero tengo un Systems.Collection.IList
, proveniente de una consulta de NHibernate.¿Cómo convierto un IList no genérico en IList <T>?
Quiero crear un método que lo convierta en IList<T>
. ¿Cómo hago esto?
¿No puede lograr que NHibernate le devuelva una IList? La interfaz ICriteria define un método List<T>
...
Si está seguro de que todos los elementos heredan de T (o cualquiera que sea el tipo que está utilizando)
IList<T> myList = nonGenericList.Cast<T>().ToList();
Si no está seguro :
IList<T> myList = nonGenericList.OfType<T>().ToList();
Por supuesto, necesitará el espacio de nombres System.Linq:
using System.Linq;
Una forma es utilizar LINQ, como list.OfType<T>()
o .Cast<T>()
Cast
y OfType
retorno IEnumerable<T>
implemetnations, no IList<T>
implementaciones, por lo que no sería útil para usted.
Llamando. Cast<T>().ToList
dará como resultado una copia adicional de la lista, que puede tener implicaciones de rendimiento adversas.
Un mejor enfoque (IMHO) sería simplemente crear una clase contenedora y hacer la conversión sobre la marcha. Desea algo como esto:
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
}
Eso tendrá la ventaja de no crear otra copia de la lista completa.
Frederik es correcto, NHibernate ya lo hace.
var data = query.List<MyType>();
Esto daría como resultado un IList del tipo que ha especificado. En este caso IList<MyType>
.
Fredrick es correcto. Pero Nhibernate también tiene una opción para devolver múltiples conjuntos de resultados. Por ejemplo:
IList multiResults = session.CreateMultiCriteria()
.Add(pageCriteria)
.Add(countCriteria)
.List();
En la llamada anterior no es una opción para devolver una lista escrita a máquina. Por lo tanto, tiene que ser emitido como se mencionó anteriormente, así:
IList<T> results = ((IList)multiResults[0]).Cast<T>().ToList();
IList counts = (IList)multiResults[1];
Sí, puedes! Simplemente use var result = Session.CreateCriteria (....). List() en vez og .List(). –
stiank81
@ stiank81: fue una pregunta retórica. ;) –
Bueno, entendí eso ;-) Solo agregué un comentario con los detalles juntos mi +1 en alegría después de solo aprender esto de usted .. – stiank81