我觉得我可能漏掉了一些技巧,而且我从来没有做过这件事。然而,我应该如何使用 "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' 运算符一起使用,因为它既没有类类型约束,也没有'class'约束。
现在,我想我明白了原因;我没有直接告诉编译器T是一个类。如果我替换成:
public abstract class SessionManager<T> where T : ISessionManager
使用
public abstract class SessionManager<T> where T : class
......然后代码成功构建。
但我的问题是:如何在泛型类型上同时实施类和ISessionManager的强制要求?我希望有一个非常简单的答案。
编辑:
补充一下,我尝试过:where T : ISessionManager, class
,结果我没有正确读取编译器错误。很简单,只需在ISessionManager
之前放置class即可解决问题。我没有阅读的错误是:
"'class'或'struct'约束必须在任何其他约束之前出现。"
愚蠢的瞬间结束。
CreateInstance<T>
。你应该添加一个new()
约束,并在代码中简单地使用new T()
。 - Mehrdad Afshari