32

像我们一样Session.Add("LoginUserId", 123); ,然后我们可以访问Session["LoginUserId"],像一个数组,我们如何实现它?

4

4 回答 4

57

你需要一个索引器

public Thing this[string index]
{
    get
    {
         // get the item for that index.
         return YourGetItemMethod(index)
    }
    set
    {
        // set the item for this index. value will be of type Thing.
        YourAddItemMethod(index, value)
    }
}

这将使您可以像使用数组一样使用类对象:

MyClass cl = new MyClass();
cl["hello"] = anotherObject;
// etc.

如果您需要更多帮助,还可以使用教程。

附录

您提到您希望它在静态类上可用。这有点复杂,因为您不能使用静态索引器。如果要使用索引器,则需要从静态字段或此答案中的某些巫术中访问它。

于 2011-07-24T14:13:52.883 回答
2

听起来您只需要一本通用字典

var session = new Dictionary<string, object>();

//set value
session.Add("key", value);

//get value
var value = session["key"] as string;

如果你想让它成为静态的,只需让它成为另一个类中的静态成员。

public static class SharedStorage
{
   private static Dictionary<string, object> _data = new Dictionary<string,object>();
   public static Dictionary<string, object> Data { get { return _data; } }
}

然后您可以直接访问它,而无需初始化它:

SharedStorage.Data.Add("someKey", "someValue");
string someValue = (string) SharedStorage.Data["someKey"];

如果您想更冒险并使用 .NET 4,您还可以使用Expando Object,例如 ASP.NET MVC 3 中控制器可用的 ViewBag 成员:

dynamic expando = new ExpandoObject();
expando.UserId = 5;
var userId = (int) expando.UserId;
于 2011-07-24T14:28:17.763 回答
2

您应该使用索引器查看链接:http: //msdn.microsoft.com/en-us/library/2549tw02.aspx

于 2011-07-24T14:47:42.897 回答
0

通过您通常使用 Session 变量的方式,您真正需要的是一个像这样的通用 Dictionary 集合。你真的不需要写一个类。但是如果你需要添加额外的功能和/或语义,你当然可以用一个类来包装集合,只包含和索引器。

对于其他集合,请查看Collections.Generic命名空间。

于 2011-07-24T14:15:56.583 回答