Generischen Typ als T umwandeln und gleichzeitig den Typ T erzwingen
Ich vermisse hier einen Trick und kann nicht glauben, dass ich das noch nie zuvor gemacht habe. Wie kann ich jedoch einen generischen Typ mit dem Schlüsselwort as umwandeln?
[Serializable]
public abstract class SessionManager<T> where T : ISessionManager
{
protected SessionManager() { }
public static T GetInstance(HttpSessionState session)
{
// Ensure there is a session Id
if (UniqueId == null)
{
UniqueId = Guid.NewGuid().ToString();
}
// Get the object from session
T manager = session[UniqueId] as T;
if (manager == null)
{
manager = Activator.CreateInstance<T>();
session[UniqueId] = manager;
}
return manager;
}
protected static string UniqueId = null;
}
Die LinieT manager = session[UniqueId] as T;
löst folgenden Fehler aus:
Der Typparameter 'T' kann nicht mit dem Operator 'as' verwendet werden, da weder eine Klassentypeinschränkung noch eine Klasseneinschränkung vorhanden ist
Nun, ich denke, ich verstehe den Grund dafür; Ich habe dem Compiler physikalisch nicht gesagt, dass T eine Klasse ist. Wenn ich ersetze:
public abstract class SessionManager<T> where T : ISessionManager
mit
public abstract class SessionManager<T> where T : class
... dann wird der Code erfolgreich erstellt.
Aber meine Frage ist so; Wie kann ich sowohl die Klassen- als auch die ISessionManager-Erzwingung für den generischen Typ festlegen? Ich hoffe, dass es dafür eine sehr einfache Antwort gibt.
BEARBEITEN: Nur um hinzuzufügen, ich hatte versucht:where T : ISessionManager, class
Es stellte sich heraus, dass ich meinen Compilerfehler nicht richtig gelesen hatte. Einfach genug, nur den Unterricht vorher zu setzenISessionManager
behebt das Problem. Der Fehler, den ich nicht gelesen hatte, war:
Msgstr "Die Einschränkung" class "oder" struct "muss vor allen anderen Einschränkungen stehen".
Dummer Moment vorbei.