Синтаксис инициализатора: новый ViewDataDictionary {{ "Name", "Value" }}
Я искал способ передать ViewDataDictionary на частичный вид в ASP.NET MVC, который я пришел к этому синтаксису:
new ViewDataDictionary { { "Name", "Value" } }
Я немного запутался в синтаксисе инициализатора. может ли кто-нибудь объяснить это мне?
Ответы
Ответ 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"}}