C# 初始化语法: new ViewDataDictionary { { "Name", "Value" } }

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/18608162/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-10 12:43:20  来源:igfitidea点击:

Initializer syntax: new ViewDataDictionary { { "Name", "Value" } }

c#initializationc#-3.0

提问by Mahmoodvcs

I was searching for a way to pass ViewDataDictionary to a partial view in ASP.NET MVC that I came to this syntax:

我正在寻找一种将 ViewDataDictionary 传递给 ASP.NET MVC 中的局部视图的方法,我使用了以下语法:

new ViewDataDictionary { { "Name", "Value" } }

I'm a bit confused about the initializer syntax here. can anyone explain it to me?

我对这里的初始化语法有点困惑。谁能给我解释一下?

采纳答案by Oliver

ViewDataDictionaryimplements IDictionary<string, object>.

ViewDataDictionary实施IDictionary<string, object>.

IDictionary<string, object>is essentially a collection of KeyValuePair<string, object>.

IDictionary<string, object>本质上是KeyValuePair<string, object>.

Your ViewDataDictionaryinitializer (outer curly braces) contains another set of curly braces that represents a KeyValuePair<string, object>initializer.

您的ViewDataDictionary初始值设定项(外大括号)包含另一组表示KeyValuePair<string, object>初始值设定项的大括号。

The reason this is possible is explained in this answer.

这个答案解释了是可能的原因。

You can Addmultiple items by comma separating the KeyValuePair<string, object>initializers:

您可以Add通过逗号分隔KeyValuePair<string, object>初始化程序的多个项目:

var data = new ViewDataDictionary 
{ 
    { "Name", "Value" }, 
    { "Name2", "Value2" } 
};

Is the same as:

是相同的:

var data = new ViewDataDictionary 
{ 
    new KeyValuePair<string, object>("Name", "Value"), 
    new KeyValuePair<string, object>("Name2", "Value2") 
};

Essentially, the inner curly braces are nice syntax for initializing KeyValuePair<string, object>objects.

本质上,内部大括号是初始化KeyValuePair<string, object>对象的好语法。

回答by fordareh

I solved this using an extension method:

我使用扩展方法解决了这个问题:

/// <summary>
/// Use this extension method to create a dictionary or objects
///     keyed by their property name from a given container object
/// </summary>
/// <param name="o">Anonymous name value pair object</param>
/// <returns></returns>
public static Dictionary<string, object> ToDictionary(this object o)
{
    var dictionary = new Dictionary<string, object>();

    foreach (var propertyInfo in o.GetType().GetProperties())
    {
        if (propertyInfo.GetIndexParameters().Length == 0)
        {
            dictionary.Add(propertyInfo.Name, propertyInfo.GetValue(o, null));
        }
    }

    return dictionary;
}

And an Html Helper extension:

还有一个 Html Helper 扩展:

/// <summary>
/// When viewData is null, we just return null.  Otherwise, we
///     convert the viewData collection to a ViewDataDictionary
/// </summary>
/// <param name="htmlHelper">HtmlHelper provided by view</param>
/// <param name="viewData">Anonymous view data object</param>
/// <returns></returns>
public static ViewDataDictionary vd(this HtmlHelper htmlHelper, object viewData)
{
    if (viewData == null) return null;

    IDictionary<string, object> dict = viewData.ToDictionary();

    //We build the ViewDataDictionary from scratch, because the
    //  object parameter constructor for ViewDataDictionary doesn't
    //  seem to work...
    ViewDataDictionary vd = new ViewDataDictionary();
    foreach (var item in dict)
    {
        vd[item.Key] = item.Value;
    }

    return vd;
}

Use from a razor file as:

使用 razor 文件作为:

@Html.Partial("~/Some/Path.cshtml", Model, Html.vd(new { SomeKey = SomeObj }))