Прежде всего, почему ваша функция получает object
в качестве параметра, а затем пытается преобразовать его в IDictionary
?Это очень плохая практика, потому что вызывающий код не знает, что значение должно быть приведено .
Если вы хотите, чтобы функция работала только с IDictionary
(без поздней привязки)магия и прочее), изложите это явно.Это, вероятно, место, где вы врезались в стену: вам нужно, чтобы он принял любой IDictionary
, верно?Возможно, именно поэтому вы пытались использовать object
и приведение типов.
Вместо этого вы должны объявить свой метод универсальным:
void WriteMap<TKey, TValue>(IDictionary<TKey, TValue> dict)
{
foreach (var kv in dict) // kv is KeyValuePair<TKey, TValue>
{
// (write key)
// (write value)
}
}
Вы можете даже применить некоторые условияна TKey
и TValue
, если хотите, см. where
ограничения типа .
В вашем случае кажется, что ключ всегда равен string
, поэтому вы можете ввестиуниверсальный параметр только для значения:
void WriteMap<TValue>(IDictionary<string, TValue> dict)
{
foreach (var kv in dict) // kv is KeyValuePair<string, TValue>
{
// (write key)
// (write value)
}
}
Одним из недостатков этого метода является то, что компилятор должен иметь возможность выводить тип TValue
во время компиляции.Если оно неизвестно или типы значений могут отличаться, может иметь смысл использовать неуниверсальный IDictionary
вместо:
void WriteMap(IDictionary dict)
{
foreach (var kv in dict) // kv is DictionaryEntry
{
// (write key)
// (write value)
}
}
Обратите внимание, что в этом случае ключ не ограничен string
.