我想在这里错过了一个技巧,我不敢相信我以前从未这样做过。但是,如何使用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;
}
第T manager = session[UniqueId] as T;
行会引发以下错误:
不能使用类型参数“T” 使用'as'运算符,因为它确实如此 没有类类型约束也没有 '阶级'约束
现在,我认为理解这个原因;我没有亲自告诉编译器T是一个类。如果我更换:
public abstract class SessionManager<T> where T : ISessionManager
与
public abstract class SessionManager<T> where T : class
...然后代码构建成功。
但我的问题是这样的;如何在泛型类型上同时具有类和ISessionManager强制执行?我希望有一个非常简单的答案。
修改
只是添加我试过:where T : ISessionManager, class
,结果我没有正确读取我的编译器错误。很简单,只需在ISessionManager
之前放置课程就可以解决问题。我没看过的错误是:
“'class'或'struct'约束 必须先到任何其他人 约束“。
愚蠢的时刻结束。
答案 0 :(得分:38)
... where T : class, ISessionManager
如果你想在这里使用where keyword
方法,那么这个例子也是使用泛型的
public void store<T>(T value, String key)
{
Session[key] = value;
}
public T retrieve<T>(String key) where T:class
{
return Session[key] as T ;
}
答案 1 :(得分:15)
where T : class, ISessionManager
你可以走得更远
where T : class, ISessionManager, new()
这将强制非抽象类与无参数ctor一起作为T
传递答案 2 :(得分:4)
阅读Constraints on Type Parameters in C#。
在这种特殊情况下,您必须确保T是一个类:
public abstract class SessionManager<T>
where T : class, ISessionManager