Как написать класс, который (например, массив) можно индексировать с помощью `arr [key]`? - PullRequest
26 голосов
/ 24 июля 2011

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

Ответы [ 4 ]

52 голосов
/ 24 июля 2011

Вам нужен индексатор :

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 голосов
/ 24 июля 2011

Вы должны использовать индексаторы Смотрите ссылку: http://msdn.microsoft.com/en-us/library/2549tw02.aspx

2 голосов
/ 24 июля 2011

Похоже, все, что вам нужно, это универсальный словарь .

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

dynamic expando = new ExpandoObject();
expando.UserId = 5;
var userId = (int) expando.UserId;
0 голосов
/ 24 июля 2011

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

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

...