Если 'значение' является входящим универсальным словарем, типы которого являются неизвестным / вопросом, как я беру его записи и помещаю их в целевой словарь типа IDictionary<object, object>
?
if(type == typeof(IDictionary<,>))
{
// this doesn't compile
// value is passed into the method as object and must be cast
IDictionary<,> sourceDictionary = (IDictionary<,>)value;
IDictionary<object,object> targetDictionary = new Dictionary<object,object>();
// this doesn't compile
foreach (KeyValuePair<,> sourcePair in sourceDictionary)
{
targetDictionary.Insert(sourcePair.Key, sourcePair.Value);
}
return targetDictionary;
}
Править:
Спасибо за ответы до сих пор.
Проблема здесь состоит в том, что аргумент Копии только известен как тип 'объект'. Например:
public void CopyCaller(object obj)
{
if(obj.GetType() == typeof(IDictionary<,>)
Copy(dictObj); // this doesn't compile
}
Вот метод (не оставляйте его статичным, если он вам не нужен, я быстро написал его console app), которое в основном преобразует словарь любого типа в словарь объекта / объекта.
private static Dictionary<object,object> DeTypeDictionary<T,U>(Dictionary<T,U> inputDictionary)
{
Dictionary<object, object> returnDictionary = new Dictionary<object, object>();
foreach(T key in inputDictionary.Keys)
{
if( (key is object) && (inputDictionary[key] is object))
{
returnDictionary.Add(key, inputDictionary[key]);
}
else
{
//sorry these aren't objects. they may be dynamics.
continue;
}
}
return returnDictionary;
}
... и вот как вы его используете ...
Dictionary<string, DateTime> d = new Dictionary<string, DateTime>();
d.Add("rsgfdg", DateTime.Now);
d.Add("gfdsgd", DateTime.Now);
Dictionary<object, object> newDictionary = DeTypeDictionary<string, DateTime>(d);
Возможно, это исправление для вас, но для использования ключевого слова var вам понадобится .net 3.5 или выше.
// this should compile
foreach (var sourcePair in sourceDictionary)
{
targetDictionary.Insert(sourcePair.Key, sourcePair.Value);
}
Сделайте свой метод также generic, и тогда вы сможете делать то, что делаете. Вам не придется изменять схему использования, поскольку компилятор сможет вывести общие типы из входных типов.
public IDictionary<object, object> Copy(IDictionary<TKey, TValue> source)
{
IDictionary<object,object> targetDictionary = new Dictionary<object,object>();
foreach (KeyValuePair<TKey, TValue> sourcePair in sourceDictionary)
{
targetDictionary.Insert(sourcePair.Key, sourcePair.Value);
}
return targetDictionary;
}
Если вам не нужно преобразовывать его из IDictionary
в IDictionary
, то вы можете использовать констуктор copy из Dictionary
, который принимает другой словарь на вход и копирует все значения - точно так же, как вы делаете сейчас.