Мы хотели присвоить/добавить объект Словарю с помощью ключевого индекса, как это:
Dictionary<string, object> dict = new Dictionary<string, object>();
dict["key"] = dict["key"] ?? "object";
Но это заканчивается к: "Данный ключ не присутствовал в словаре".
Есть ли любой способ, которым мы могли присвоить значения этому словарю то же как способ, которым я присваиваю значения сессиям, использование пустого указателя объединяет:
Session["Member"] = Session["Member"] ?? new Member();
Спасибо
Править: Я на самом деле пытался переопределить индексатор от дочернего класса словаря, но напрасно. Интерфейс Implementing IDictionary казался бы слишком много, потому что нам просто нужна функциональность кода ниже (т.е. пустой указатель возврата, если ключ не найден). Таким образом, я думаю, возможно, мы могли использовать расширения как:
public static TValue [this Dictionary<TKey, TValue> thisDictionary, TKey key] {
get { return thisDictionary.ContainsKey(key) ? thisDictionary[key] : null; }
set { thisDictionary[key] = value; }
}
но это не работает или даже компилирует.
Какие-либо другие более простые пути, таким образом, мы могли снова использовать эту функциональность индексатора?Большое спасибо.
Если вы хотите сделать это встроенным:
dict["key"] = dict.ContainsKey("key") ? (dict["key"] ?? "object") : "object";
Альтернативно:
dict["key"] = dict.ContainsKey("key") && dict["key"] == null ? dict["key"] : "object";
Редактировать согласно комментариям:
public static TValue GetSafe(this Dictionary<TKey, TValue> thisDictionary, TKey key)
{
if (!thisDictionary.ContainsKey(key))
thisDictionary[key] = null;
return thisDictionary[key];
}
Это позволяет вам сделать это:
thisDictionary["randomKey"] = thisDictionary.GetSafe("randomKey") ?? "someValue";
Как вы заметили, попытка получить отсутствующий ключ вызывает исключение. Вы должны сначала проверить, существует ли ключ:
if( !Session.ContainsKey("Member") )
Session["Member"] = new Member();
Изменить:
И ответить на ваш вопрос; вы можете создать свой собственный индексатор или реализовать интерфейс IDictionary. Таким образом, вы можете избежать стандартного поведения, вызывающего исключение