2016-05-02 2 views
1

Я работал над HtmlHelper.AnonymousObjectToHtmlAttributes.Как правильно разобрать словарь <string, object> в

Он хорошо работает с анонимной объекта:

var test = new {@class = "aaa", placeholder = "bbb"}; 
var parseTest= HtmlHelper.AnonymousObjectToHtmlAttributes(test); 

Результат parseTest имеет две пары ключ-значение.

Но для Dictionary объекта:

var attrsInDict = new Dictionary<string,object>() {    
    {"class", "form-control"}, 
    {"placeholder", "Select one..."} 
}; 
var attrs = HtmlHelper.AnonymousObjectToHtmlAttributes(attrsInDict); 

attrs получается странный объект, с 4 клавишами и 4 значения. 4 клавиши: Сравнение, Подсчет, Ключи, Значения.

Некоторое другое сообщение SO, спрашивающее о различии между ними (here). Выбранный ответ говорит

Там не слишком большая разница ...

на самом деле? И каков правильный способ разобрать attrsInDict и получить тот же результат, что и тот, который мы получаем от анонимного объекта?

Ибо я намерен объединить attribues в следующем коде:

var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
foreach (var item in attrs) 
{ 
    if (attr.ContainsKey(item.Key)) 
    { 
     attr[item.Key] = $"{attr[item.Key]} {item.Value}"; 
    } 
    else 
    { 
     attr.Add(item.Key, item.Value); 
    } 
} 

ответ

4

Результаты не странно - они именно то, что я ожидал бы от метода, называемого AnonymousObjectToHtmlAttributes. Метод ожидает ввода как test, фактический анонимный объект, а не экземпляр конкретного класса, такого как Dictionary.

Что вы видите в случае передачи экземпляра Dictionary являются его общественные свойства, которые действительно являются Comparer, Count, Keys и Values свойства.

Обратный код AnonymousObjectToHtmlAttributes: RouteValueDictionary. Этот класс имеет перегрузку конструктора, которая принимает IDictionary<string, object>.

Чтобы правильно использовать словарь, сделать это:

var attrs = new RouteValueDictionary(attrsInDict); 
+0

Я не вижу разницы между 'new RouteValueDictionary (attrsInDict);' и 'HtmlHelper.AnonymousObjectToHtmlAttributes (attrsInDict);'. Оба возвратили тот же результат. Что-нибудь я пропустил? – Blaise

+0

@Blaise: Эти два примера не то же самое; вы не должны передавать экземпляр слова в метод 'HtmlHelper' - только анонимные объекты.Чтобы получить тот же результат от анонимного объекта и экземпляра словаря, вам нужно использовать два разных подхода. –

0

Comparer, граф, ключи и значения являются открытыми свойствами класса Dictionary. Таким образом, вы получаете именно то, что вы запрашиваете. Если вам нужны фактические пары «ключ-значение», вам необходимо перебрать словарь.

0

AnonymousObjectToHtmlAttributes метод, скорее всего, использует отражение для итерации через общедоступные свойства предоставленного типа. Как видно из его documentation, единственными свойствами, кроме индексатора, являются Comparer, Count, Keys и Values.

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