在强制执行T类型的同时,将通用类型“强制转换为T”
我想在这里错过了一个技巧,我不敢相信我以前从未这样做过。 但是,如何使用as关键字转换generics类型?
[Serializable] public abstract class SessionManager 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(); session[UniqueId] = manager; } return manager; } protected static string UniqueId = null; }
行T manager = session[UniqueId] as T;
抛出以下错误:
类型参数“T”不能与“as”运算符一起使用,因为它没有类类型约束,也没有“类”约束
现在,我认为理解这个的原因; 我没有亲自告诉编译器T是一个类。 如果我更换:
public abstract class SessionManager where T : ISessionManager
同
public abstract class SessionManager where T : class
…然后代码构建成功。
但我的问题是这样的; 如何在generics类型上同时具有类和ISessionManager强制? 我希望有一个非常简单的答案。
编辑:只是添加我试过: where T : ISessionManager, class
,结果我没有正确读取我的编译器错误。 简单地说,只需在ISessionManager
之前放置类就可以解决问题。 我没看过的错误是:
“’类’或’结构’约束必须先于任何其他约束”。
愚蠢的时刻结束。
... where T : class, ISessionManager
如果你想在这里使用where keyword
,那么这个例子也是使用generics的
public void store(T value, String key) { Session[key] = value; } public T retrieve (String key) where T:class { return Session[key] as T ; }
where T : class, ISessionManager
你可以走得更远
where T : class, ISessionManager, new()
这将迫使非抽象类与无参数ctor一起作为T传递
阅读C#中关于类型参数的约束 。
在这种特殊情况下,您必须确保T是一个类:
public abstract class SessionManager where T : class, ISessionManager