如何编写一个类(如数组)可以用`arr [key]`索引?

时间:2011-07-24 14:12:22

标签: c# .net arrays indexer

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

4 个答案:

答案 0 :(得分:51)

您需要indexer

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.

如果您需要更多帮助,还可以使用tutorial

<强>附录

您提到您希望在静态类中使用它。这有点复杂,因为你不能使用静态索引器。如果您想使用索引器,则需要使用静态字段或this answer中的某些法术来访问它。

答案 1 :(得分:2)

听起来你需要的只是generic dictionary

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;

答案 2 :(得分:2)

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

答案 3 :(得分:0)

通常使用Session变量,你真正需要的只是generic Dictionary collection like this one。你真的不需要写一个班级。但是如果你需要添加额外的功能和/或语义,你肯定可以用一个类来包装集合,只需要包含和索引器。

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