Casting generic type „as T”, wymuszając typ T
Brakuje mi tutaj triku, myślę i nie mogę uwierzyć, że nigdy wcześniej tego nie robiłem. Jak jednak mogę rzucić typ ogólny za pomocą słowa kluczowego as?
[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;
}
LiniaT manager = session[UniqueId] as T;
generuje następujący błąd:
Parametru typu „T” nie można używać z operatorem „as”, ponieważ nie ma on ograniczenia typu klasy ani ograniczenia „klasy”
Teraz myślę, że rozumiem powód tego; Nie powiedziałem fizycznie kompilatorowi, że T jest klasą. Jeśli wymienię:
public abstract class SessionManager<T> where T : ISessionManager
z
public abstract class SessionManager<T> where T : class
... wtedy kod buduje się pomyślnie.
Ale moje pytanie jest takie; w jaki sposób mogę mieć zarówno wymuszenia klasy i ISessionManager na typie ogólnym? Mam nadzieję, że jest na to bardzo prosta odpowiedź.
EDYTOWAĆ: Aby dodać, próbowałem:where T : ISessionManager, class
, okazało się, że nie odczytałem poprawnie mojego kompilatora. Po prostu wystarczy umieścić klasę wcześniejISessionManager
rozwiązuje problem. Błąd, którego nie przeczytałem, brzmiał:
„Ograniczenie„ class ”lub„ struct ”musi występować przed jakimikolwiek innymi ograniczeniami”.
Głupia chwila.