Pregunta

public static IList<T> LoadObjectListAll<T>()
{
    ISession session = CheckForExistingSession();
    var cfg = new NHibernate.Cfg.Configuration().Configure();
    var returnList = session.CreateCriteria(typeof(T));
    var list = returnList.List();
    var castList = list.Cast<typeof(T)>();
    return castList;
}

Entonces, recibo un error de compilación al convertir el elemento "lista" en una IList genérica...¿Alguien puede ver un error evidente aquí?

¿Fue útil?

Solución

T no es un tipo ni un System.Type. T es un parámetro de tipo. typeof(T) devuelve el tipo de T.El typeof El operador no actúa sobre un objeto, devuelve el Type objeto de un tipo. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@John tiene razón al responder su pregunta directa.Pero el código NHibernate está un poco apagado.No deberías configurar el ISessionFactory después obteniendo el ISession, Por ejemplo.

public static T[] LoadObjectListAll()
{
    var session = GetNewSession();
    var criteria = session.CreateCriteria(typeof(T));
    var results = criteria.List<T>();
    return results.ToArray();        
}

Otros consejos

Creo

var castList = list.Cast<typeof(T)>();

debiera ser

var castList = list.Cast<T>();

@Jon limjap El error más evidente que puedo ver es que un IList es definitivamente diferente de un IList<T>.Un IList no es genérico (por ejemplo, ArrayList).

La pregunta original ya estaba usando un IList<T>.Se eliminó cuando alguien editó el formato.Probablemente sea un problema con Markdown.

Corregido ahora.

IList es un IList<T>, simplemente fue eliminado por Markdown cuando lo publicó.Intenté formatearlo, pero no pude escapar de la <T>... Arreglando eso ahora.

CLI solo admite argumentos genéricos para covarianza y contravarianza cuando se usan delegados, pero cuando se usan genéricos existen algunas limitaciones, por ejemplo, puede convertir una cadena a un objeto, por lo que la mayoría de la gente asumirá que puede hacer lo mismo con una Lista a una Lista, pero no puede hacerlo porque no hay covarianza entre los parámetros genéricos; sin embargo, puede simular la covarianza como puede ver en este artículo.Por lo tanto, depende del tipo de tiempo de ejecución que genera la fábrica abstracta.

Eso se lee como una cadena de Markov...Bravo.

T ya es un parámetro de tipo, no es necesario llamar a typeof en él.TypeOf toma un tipo y devuelve su parámetro de tipo.

"La pregunta original ya estaba usando un IList<T>.Se eliminó cuando alguien editó el formato.Probablemente sea un problema con Markdown."

Eso es lo que vi, pero fue editado por alguien y esa es la razón por la que puse mi explicación sobre la covarianza, pero por alguna razón me marcaron en -1.

Tienes demasiadas variables temporales que son confusas.

en lugar de

var returnList = session.CreateCriteria(typeof(T));
var list = returnList.List();
var castList = list.Cast<typeof(T)>();
return castList;

Solo haz

return session.CreateCriteria(typeof(T)).List().Cast<T>();

@Jonathan Holanda

T ya es un parámetro de tipo, no es necesario llamar a typeof en él.TypeOf toma un tipo y devuelve su parámetro de tipo.

typeof "toma" un tipo y devuelve su System.Type

CLI solo admite argumentos genéricos para covarianza y contravarianza cuando se usan delegados, pero cuando se usan genéricos existen algunas limitaciones, por ejemplo, puede convertir una cadena a un objeto, por lo que la mayoría de la gente asumirá que puede hacer lo mismo con List<string> a un List<object> pero no puedes hacer eso porque no hay covarianza entre los parámetros genéricos. Sin embargo, puedes simular la covarianza como puedes ver en este artículo.Por lo tanto, depende del tipo de tiempo de ejecución que genera la fábrica abstracta.

@Jon y @Jonathan son correctos, pero también debes cambiar el tipo de devolución a

IList<T>

también.A menos que sea solo un error de rebajas.

@jonathan, supuse que ese era el caso.

No estoy seguro de qué versión de NHibernate estás usando.Todavía no he probado la versión Gold 2.0, pero puedes limpiar un poco el método eliminando algunas líneas:

public static IList<T> LoadObjectListAll()
{
    ISession session = CheckForExistingSession();
    // Not sure if you can configure a session after retrieving it.  CheckForExistingSession should have this logic.
    // var cfg = new NHibernate.Cfg.Configuration().Configure();
    var criteria = session.CreateCriteria(typeof(T));
    return criteria.List<T>();
}

El error más flagrante que puedo ver es que un IList es definitivamente diferente de un IList<T>.Un IList no es genérico (p. ej., ArrayList).

Entonces la firma de tu método debería ser:

public static IList<T> LoadObjectListAll()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top