djd*_*d87 21 c# asp.net generics
我想在这里错过了一个技巧,我不敢相信我以前从未这样做过.但是,如何使用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;
}
Run Code Online (Sandbox Code Playgroud)
该行T manager = session[UniqueId] as T;
引发以下错误:
类型参数"T"不能与"as"运算符一起使用,因为它没有类类型约束,也没有"类"约束
现在,我认为理解这个的原因; 我没有亲自告诉编译器T是一个类.如果我更换:
public abstract class SessionManager<T> where T : ISessionManager
Run Code Online (Sandbox Code Playgroud)
同
public abstract class SessionManager<T> where T : class
Run Code Online (Sandbox Code Playgroud)
...然后代码构建成功.
但我的问题是这样的; 如何在泛型类型上同时具有类和ISessionManager强制执行?我希望有一个非常简单的答案.
编辑:
只是添加我试过:where T : ISessionManager, class
,结果我没有正确读取我的编译器错误.简单地说,只需在ISessionManager
修复问题之前安排课程.我没看过的错误是:
"'类'或'结构'约束必须先于任何其他约束".
愚蠢的时刻结束.
Meh*_*ari 38
... where T : class, ISessionManager
Run Code Online (Sandbox Code Playgroud)
如果你想使用where keyword
on方法这里是一个也使用泛型的例子
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 ;
}
Run Code Online (Sandbox Code Playgroud)
And*_*air 15
where T : class, ISessionManager
Run Code Online (Sandbox Code Playgroud)
你可以走得更远
where T : class, ISessionManager, new()
Run Code Online (Sandbox Code Playgroud)
这将强制非抽象类与无参数ctor一起交给T