如何正确解析Dictionary <string,object =“”>到

时间:2016-05-02 20:35:30

标签: c# asp.net-mvc dictionary anonymous-objects

我正在研究HtmlHelper.AnonymousObjectToHtmlAttributes

它适用于匿名对象:

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个键是 Comparer Count

其他一些SO帖子询问两者之间的区别(here)。选定的答案说

  

没有太大的区别......

真的?什么是解析attrsInDict并获得与我们从匿名对象获得的结果相同的结果的正确方法?

因为,我打算在以下代码中合并属性:

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);
    }
}

3 个答案:

答案 0 :(得分:4)

结果并不奇怪 - 它们正是我所期望的名为AnonymousObjectToHtmlAttributes的方法。该方法需要输入test,一个实际的匿名对象,而不是像Dictionary这样的具体类的实例。

在传递Dictionary实例的情况下,您看到的是它的公共属性,它们确实是ComparerCountKeys和{ {1}}属性。

Values的返回类型为AnonymousObjectToHtmlAttributes。该类有一个接受RouteValueDictionary的构造函数重载。

要正确使用字典,请执行以下操作:

IDictionary<string, object>

答案 1 :(得分:0)

Comparer,Count,Keys和Values是类Dictionary的公共属性。所以你得到的正是你要求的。如果你想要实际的键值对,你需要迭代字典。

答案 2 :(得分:0)

AnonymousObjectToHtmlAttributes方法最有可能使用反射来迭代所提供类型的公共属性。如documentation所示,除了索引器之外,唯一的属性是ComparerCountKeysValues