在强制执行T类型的同时将通用类型"强制转换为T"

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 keywordon方法这里是一个也使用泛型的例子

    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)

  • 这将教我正确阅读编译器错误. (7认同)

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