2012-06-25 4 views
0

Я написал метод расширения, помогающий собирать данные о сбоях во время отчетов об ошибках. Этот метод разработан, чтобы гарантировать, что ключ всегда уникален. Если у вас есть несколько блоков try/catch, иногда данные могут дублироваться. Я собираюсь здесь достаточно легко, а не супер-лучшие практики.Обеспечение уникальных ключей в Exception.Data IDictionary

Проблема: изменение ключа, если оно не уникально. Когда я пытаюсь использовать метод ниже, я получаю «невозможно преобразовать из« string »в« TKey ». Есть идеи?

public static void AddUnique<TKey, TValue>(this System.Collections.IDictionary dictionary, TKey key, TValue value) 
    { 
     if(dictionary[key] != null) 
     { 
      var newKey = key.ToString() + "-"; 
      AddUnique<TKey, TValue>(dictionary, newKey, value); 
     }    

     ... 
    } 

ответ

2

Если вы знаете, что ваши ключи будут всегда строки, а затем удалить TKey общий параметр из сигнатуры метода, а просто использовать string на своем месте. Кроме того, вы можете сохранить оба общих параметра, но изменить рекурсивный вызов на AddUnique<string, TValue>().

+0

Отличная идея. Это кажется таким очевидным. Могу ли я иметь такой метод, как AddUniqueInner (словарь System.Collections.IDictionary, строковый ключ, значение объекта)? Это спасло бы TValue, верно? –

+1

Поскольку строки являются, пожалуй, лучшей идеей для ключей, я бы просто сделал подпись 'AddUnique (этот IDictionary dict, строковый ключ, значение TValue)' – dlev

+0

Это убивает метод расширения, правда, не так ли? Это не соответствует подписи Exception.Data.Add. –

0

Вы не можете соединить строку с каждым возможным ключом. Вы должны решения этой проблемы:

  • использовать только строки в качестве ключей
  • использовать то, что является уникальным всегда, например, URL или GUID *

Это действительно не уникально, но вероятность столкновения близка к 0, особенно на одной машине. More info on the subject.

Смежные вопросы