Что самый минимизированный путь состоит в том, чтобы преобразовать Словарь <строка, строка> к Словарю <строка, объект>?

Я использую API, который возвращает набор значения ключа как a Dictionary<string, string>. Я должен преобразовать это в a Dictionary<string, object>. У меня есть смысл, что должен быть способ сделать это преобразование/отображение без "вручную" цикличного выполнения через каждую пару "ключ-значение", но Гугление или ссылка на объект C# сразу не привели к решению.

14
задан Ates Goral 2 February 2010 в 23:05
поделиться

3 ответа

Попробуйте следующее

var newMap = oldMap.ToDictionary(pair => pair.Key, pair=>(object)pair.Value);
25
ответ дан 1 December 2019 в 09:32
поделиться

Никаких перекручиваний, отображает Словарь{T, U} в Словарь{T, объект} в постоянное время:

class DictionaryWrapper<T, U> : IDictionary<T, object>
{
    readonly Dictionary<T, U> inner;
    public DictionaryWrapper(Dictionary<T, U> wrapped)
    {
        this.inner = wrapped;
    }

    #region IDictionary<T,object> Members

    public void Add(T key, object value) { inner.Add(key, (U)value); }
    public bool ContainsKey(T key) { return inner.ContainsKey(key); }
    public ICollection<T> Keys { get { return inner.Keys; } }
    public bool Remove(T key) { return inner.Remove(key); }

    public bool TryGetValue(T key, out object value)
    {
        U temp;
        bool res = inner.TryGetValue(key, out temp);
        value = temp;
        return res;
    }

    public ICollection<object> Values { get { return inner.Values.Select(x => (object)x).ToArray(); } }

    public object this[T key]
    {
        get { return inner[key]; }
        set { inner[key] = (U)value; }
    }

    #endregion

    #region ICollection<KeyValuePair<T,object>> Members

    public void Add(KeyValuePair<T, object> item) { inner.Add(item.Key, (U)item.Value); }
    public void Clear() { inner.Clear(); }
    public bool Contains(KeyValuePair<T, object> item) { return inner.Contains(new KeyValuePair<T, U>(item.Key, (U)item.Value)); }
    public void CopyTo(KeyValuePair<T, object>[] array, int arrayIndex) { throw new NotImplementedException(); }
    public int Count { get { return inner.Count; } }
    public bool IsReadOnly { get { return false; } }
    public bool Remove(KeyValuePair<T, object> item) { return inner.Remove(item.Key); }

    #endregion

    #region IEnumerable<KeyValuePair<T,object>> Members

    public IEnumerator<KeyValuePair<T, object>> GetEnumerator()
    {
        foreach (var item in inner)
        {
            yield return new KeyValuePair<T, object>(item.Key, item.Value);
        }
    }

    #endregion

    #region IEnumerable Members

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        foreach (var item in inner)
        {
            yield return new KeyValuePair<T, object>(item.Key, item.Value);
        }
    }

    #endregion
}

С помощью нескольких более общих параметров можно далее обобщить данный класс, чтобы он отображал Словарь{A, B} в Словарь{C, D}.

3
ответ дан 1 December 2019 в 09:32
поделиться

Вы можете использовать этот метод расширения:

public static class ObjectExtensions
{
    public static object GetPropertyValue(this object obj, string property)
    {
        return TypeDescriptor.GetProperties(obj)[property].GetValue(obj);
    }

    public static IDictionary<string, object> ToDictionary(this object obj)
    {
        IDictionary<string, object> result = new Dictionary<string, object>();
        PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(obj);
        foreach (PropertyDescriptor property in properties)
        {
            result.Add(property.Name, property.GetValue(obj));
        }
        return result;
    }
}

Вы можете использовать его как:

 новый словарь <строка, строка> (). ToDictionary (); 
 
0
ответ дан 1 December 2019 в 09:32
поделиться
Другие вопросы по тегам:

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