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

时间:2009-11-12 12:06:02

标签: 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;

}

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'约束   必须先到任何其他人   约束“。

愚蠢的时刻结束。

3 个答案:

答案 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