Frage

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;
}

Ich erhalte also einen Build-Fehler, bei dem ich das Element „list“ in eine generische IList umwandle ...Kann hier jemand einen eklatanten Fehler erkennen?

War es hilfreich?

Lösung

T ist weder ein Typ noch ein System.Type. T ist ein Typparameter. typeof(T) gibt den Typ von zurück T.Der typeof Der Operator wirkt nicht auf ein Objekt, sondern gibt das zurück Type Objekt eines Typs. http://msdn.microsoft.com/en-us/library/58918ffs.aspx

@John hat Recht mit der Beantwortung Ihrer direkten Frage.Aber der NHibernate-Code dort ist ein wenig daneben.Sie sollten das nicht konfigurieren ISessionFactory nach das bekommen ISession, Zum Beispiel.

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

Andere Tipps

Ich finde

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

sollte sein

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

@Jon limjap Der eklatanteste Fehler, den ich sehen kann, ist, dass ein IList ist definitiv anders als ein IList<T>.Ein IList ist nicht generisch (zB,, ArrayList).

In der ursprünglichen Frage wurde bereits ein verwendet IList<T>.Es wurde entfernt, als jemand die Formatierung bearbeitete.Wahrscheinlich ein Problem mit Markdown.

Jetzt behoben.

Bei der IList handelt es sich um eine IList<T>, sie wurde gerade durch Markdown gelöscht, als sie sie veröffentlichte.Ich habe versucht, es zu formatieren, aber ich habe es versäumt, dem <T> zu entkommen. Das werde ich jetzt beheben.

CLI unterstützt bei der Verwendung von Delegaten nur generische Argumente für Kovarianz und Kontravarianz, aber bei der Verwendung von Generika gibt es einige Einschränkungen, zum Beispiel können Sie eine Zeichenfolge in ein Objekt umwandeln, sodass die meisten Leute davon ausgehen, dass Sie dasselbe mit List to a List tun können, aber Dies ist nicht möglich, da zwischen generischen Parametern keine Kovarianz besteht. Sie können jedoch Kovarianz simulieren, wie Sie in diesem Artikel sehen können.Es kommt also auf den Laufzeittyp an, der von der abstrakten Factory generiert wird.

Das liest sich wie eine Markov-Kette ...Bravo.

T ist bereits ein Typparameter, Sie müssen typeof nicht dafür aufrufen.TypeOf nimmt einen Typ und gibt seinen Typparameter zurück.

„In der ursprünglichen Frage wurde bereits ein verwendet IList<T>.Es wurde entfernt, als jemand die Formatierung bearbeitete.Wahrscheinlich ein Problem mit Markdown.

Das habe ich gesehen, aber es wurde von jemandem bearbeitet und das ist der Grund, warum ich meine Erklärung zur Kovarianz abgegeben habe, aber aus irgendeinem Grund wurde ich auf -1 herabgestuft.

Sie haben zu viele temporäre Variablen, die verwirrend sind

anstatt

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

Mach einfach

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

@Jonathan Holland

T ist bereits ein Typparameter, Sie müssen typeof nicht dafür aufrufen.TypeOf nimmt einen Typ und gibt seinen Typparameter zurück.

typeof „nimmt“ einen Typ und gibt ihn zurück System.Type

CLI unterstützt nur generische Argumente für Kovarianz und Kontravarianz B. bei der Verwendung von Delegaten, aber bei der Verwendung von Generika gibt es einige Einschränkungen. Beispielsweise können Sie eine Zeichenfolge in ein Objekt umwandeln, sodass die meisten Leute davon ausgehen, dass Sie dasselbe damit tun können List<string> zu einem List<object> Dies ist jedoch nicht möglich, da zwischen generischen Parametern keine Kovarianz besteht. Sie können jedoch Kovarianz simulieren, wie Sie hier sehen können Artikel.Es kommt also auf den Laufzeittyp an, der von der abstrakten Factory generiert wird.

@Jon und @Jonathan sind korrekt, aber Sie müssen auch den Rückgabetyp in ändern

IList<T>

Auch.Es sei denn, das ist nur ein Markdown-Bug.

@Jonathan, dachte, das sei der Fall.

Ich bin nicht sicher, welche Version von nHibernate Sie verwenden.Ich habe die Gold-Version 2.0 noch nicht ausprobiert, aber Sie könnten die Methode etwas bereinigen, indem Sie einige Zeilen entfernen:

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>();
}

Der eklatanteste Fehler, den ich sehen kann, ist, dass ein IList ist definitiv anders als ein IList<T>.Ein IList ist nicht generisch (z. B. ArrayList).

Ihre Methodensignatur sollte also wie folgt lauten:

public static IList<T> LoadObjectListAll()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top