我如何把两个类似于类的dict包装在一起?

时间:2009-07-03 09:41:46

标签: c# class

我想把HttpContext.Current.Request和HttpContext.Current.Session一起包装成一个类。

基本上我想写col [“key”];并检查其中一个是否为密钥,如果不存在则检查另一个。

AFAIK他们不共享界面(我使用“转到定义”环顾四周,但我非常糟糕)。我如何编写一个可以将这两种类型作为参数的类?我尝试编写一个接口但是没有用,因为这些类不会从它们继承。我尝试分配对象o =请求;然后写对象o2 = o [“key”];但这也造成了编译错误。

我很肯定这可以轻松完成但我不知道如何。

3 个答案:

答案 0 :(得分:4)

扩展方法怎么样? E.g:

public static object Get(this HttpContext context, string key)
{
    return context.Request[key] ?? context.Session[key];
}

现在你可以像这样使用它了

HttpContext.Current.Get(key);

答案 1 :(得分:2)

public class RequestOrSession
{
    public object this[string key]
    {
        get
        {
            HttpContext context = HttpContext.Current;
            if (context == null)
            {
                throw new InvalidOperationException("Where's the HttpContext?");
            }

            // if the same key exists in Request and Session
            // then Request will currently be given priority
            return context.Request[key] ?? context.Session[key];
        }
    }
}

答案 2 :(得分:2)

HttpRequest有一个索引器可以执行此操作,但不适用于会话 - 虽然它很慢(来自反射器的代码):

public string this[string key]
{
    get
    {
        string str = this.QueryString[key];
        if (str != null)
        {
            return str;
        }
        str = this.Form[key];
        if (str != null)
        {
            return str;
        }
        HttpCookie cookie = this.Cookies[key];
        if (cookie != null)
        {
            return cookie.Value;
        }
        str = this.ServerVariables[key];
        if (str != null)
        {
            return str;
        }
        return null;
    }
}

这不是一个真正的答案,只是一个观察。由于它包含一个代码示例,我没有把它作为评论。