Подтвердить что ты не робот

Синтаксис инициализатора: новый ViewDataDictionary {{ "Name", "Value" }}

Я искал способ передать ViewDataDictionary на частичный вид в ASP.NET MVC, который я пришел к этому синтаксису:

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

Я немного запутался в синтаксисе инициализатора. может ли кто-нибудь объяснить это мне?

4b9b3361

Ответ 1

ViewDataDictionary реализует IDictionary<string, object>.

IDictionary<string, object> по сути является коллекцией KeyValuePair<string, object>.

Инициализатор ViewDataDictionary (внешние фигурные скобки) содержит другой набор фигурных скобок, который представляет инициализатор KeyValuePair<string, object>.

Причина, по которой это возможно, объясняется в этом ответе.

Вы можете Add несколько элементов через запятую, разделяя инициализаторы KeyValuePair<string, object>:

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

Такой же как:

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

По сути, внутренние фигурные скобки - это хороший синтаксис для инициализации объектов KeyValuePair<string, object>.

Ответ 2

Я решил это с помощью метода расширения:

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

И расширение 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;
}

Использовать из файла бритвы как:

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

Ответ 3

Спасибо всем, но почему он использует новое ключевое слово в представлении словаря?

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