Как обработать универсальный словарь, типы которого неизвестны и не имеют значения?

Если 'значение' является входящим универсальным словарем, типы которого являются неизвестным / вопросом, как я беру его записи и помещаю их в целевой словарь типа 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 
} 
5
задан ck. 27 February 2010 в 02:32
поделиться

3 ответа

Вот метод (не оставляйте его статичным, если он вам не нужен, я быстро написал его 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);
1
ответ дан 14 December 2019 в 19:11
поделиться

Возможно, это исправление для вас, но для использования ключевого слова var вам понадобится .net 3.5 или выше.

// this should compile
foreach (var sourcePair in sourceDictionary)
{
     targetDictionary.Insert(sourcePair.Key, sourcePair.Value);
}
-1
ответ дан 14 December 2019 в 19:11
поделиться

Сделайте свой метод также 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, который принимает другой словарь на вход и копирует все значения - точно так же, как вы делаете сейчас.

5
ответ дан 14 December 2019 в 19:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: