【问题标题】:How to correctly parse Dictionary<string, object> into如何正确解析 Dictionary<string, object> 成
【发布时间】:2016-05-02 20:35:29
【问题描述】:

我正在处理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 帖子询问两者之间的区别(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);
    }
}

【问题讨论】:

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


    【解决方案1】:

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

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

    AnonymousObjectToHtmlAttributes 的返回类型为RouteValueDictionary。该类具有接受IDictionary&lt;string, object&gt; 的构造函数重载。

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

    var attrs = new RouteValueDictionary(attrsInDict);
    

    【讨论】:

    • 我认为new RouteValueDictionary(attrsInDict);HtmlHelper.AnonymousObjectToHtmlAttributes(attrsInDict); 之间没有区别。两者都返回了相同的结果。我错过了什么?
    • @Blaise:这两个例子不一样;您不应该将字典实例传递给 HtmlHelper 方法——只能是匿名对象。要从匿名对象和 Dictionary 实例中获得相同的结果,您需要使用两种不同的方法。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-05-13
        • 2014-10-22
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-12
        相关资源
        最近更新 更多