Как написать класс, который (например, массив) может быть проиндексирован с помощью 'arr [key]'?

Как и мы, Session.Add("LoginUserId", 123); и тогда мы можем получить доступ к Session["LoginUserId"], как массив, как мы его реализуем?

Ответ 1

Вам нужен указатель:

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.

Там также доступно учебное пособие, если вам нужна дополнительная помощь.

Добавление:

Вы упомянули, что хотите, чтобы это было доступно в статическом классе. Это немного усложняется, потому что вы не можете использовать статический указатель. Если вы хотите использовать индекс, вам нужно получить доступ к нему из статического поля или некоторого такого колдовства, как в этом ответе.

Ответ 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, например, элемент ViewBag, доступный для контроллеров в ASP.NET MVC 3:

dynamic expando = new ExpandoObject();
expando.UserId = 5;
var userId = (int) expando.UserId;

Ответ 4

С тем, как вы обычно используете переменную Session, вам действительно нужна общая коллекция словарей, подобная этой. Вам не нужно писать класс. Но если вам нужно добавить дополнительные функции и/или семантику, вы можете, конечно, обернуть коллекцию классом и просто включить и индексировать.

Для других коллекций проверьте пространство имен Collections.Generic.