如何正确解析Dictionary<string, object>成

How to correctly parse Dictionary<string, object> into

我正在研究 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个Keys和4个Values。这 4 个键是 ComparerCountKeysValues.

一些其他SO post询问两者之间的区别(here)。所选答案显示

There's not too much difference...

真的吗?解析 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);
    }
}

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

这样的具体 class 的实例

在传递 Dictionary 实例的情况下,您看到的是它的 public 属性,它们确实是 ComparerCountKeysValues 属性。

AnonymousObjectToHtmlAttributes 的 return 类型是 RouteValueDictionary。 class 有一个接受 IDictionary<string, object>.

的构造函数重载

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

var attrs = new RouteValueDictionary(attrsInDict);

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

AnonymousObjectToHtmlAttributes 方法很可能使用反射来遍历所提供类型的 public 属性。如其 documentation 所示,除了索引器之外的唯一属性是 ComparerCountKeysValues.