Удалить элемент из общего словаря? - PullRequest
1 голос
/ 10 июня 2011

У меня есть это:

public static void Remove<T>(string controlID) where T: new()
{
    Logger.InfoFormat("Removing control {0}", controlID);
    T states = RadControlStates.GetStates<T>();

    //Not correct.
    (states as SerializableDictionary<string, object>).Remove(controlID);
    RadControlStates.SetStates<T>(states);
}

состояния всегда будут SerializableDictionary со строковыми ключами. Тип значений варьируется. Есть ли способ выразить это? Приведение к SerializableDictioanry<string, object> всегда дает ноль.

Ответы [ 3 ]

5 голосов
/ 10 июня 2011

Для этого можно использовать неуниверсальный интерфейс словаря:

(states as IDictionary).Remove(controlID);
2 голосов
/ 10 июня 2011

Одна из опций делает тип значения вашим универсальным параметром:

public static void Remove<TValue>(string controlID)
{
    Logger.InfoFormat("Removing control {0}", controlID);
    SerializableDictionary<string,TValue> states =
        RadControlStates.GetStates<SerializableDictionary<string,TValue>>();
    states.Remove(controlID);
    RadControlStates.SetStates<SerializableDictionary<string,TValue>>(states);
}
1 голос
/ 10 июня 2011

Один из вариантов - передать лямбду в метод, представляющий операцию удаления.Например

public static void Remove<T>(
  string controlID,
  Action<T, string> remove) where T: new()
{
    Logger.InfoFormat("Removing control {0}", controlID);
    T states = RadControlStates.GetStates<T>();
    remove(states, controlID);
    RadControlStates.SetStates<T>(states);
}

И тогда на сайте вызова перейдите в соответствующую лямбду

Remove<SerializableDictionary<string, TheOtherType>>(
  theId, 
  (dictionary, id) => dictionary.Remove(id));
...