Лучший способ получить свойства из MenuItemDefinition.CustomData - PullRequest
0 голосов
/ 18 ноября 2018

Я использую customData свойство MenuItemDefinition из навигации ASP.NETBoilerplate, чтобы определить некоторые дополнительные свойства.

Я могу получить доступ к свойствам, используя следующий код

 var properties = menuItem.CustomData?.GetType().GetProperties();
 bool isMegaMenu = (bool)properties.First(x => x.Name == "MegaMenu").GetValue(menuItem.CustomData);

Это прекрасно работает, но есть лучший способ получить доступ к свойствам.Я попытался получить доступ к объекту, сначала приведя его к динамическому

 dynamic t = menuItem.CustomData;
 isMegaMenu = t.MegaMenu;

Но это приводит к следующей ошибке

RuntimeBinderException: 'object' does not contain a definition for 'MegaMenu'

Я посмотрел на этот пост который предлагает использовать InternalsVisibleTo, но он использует его в тестовом примере, я не уверен, что это хорошая идея использовать его на производстве.

РЕДАКТИРОВАНИЕ:

Вот как выглядит MenuItemDefinition и свойство customData

new MenuItemDefinition(
      PageNames.Apps,
      L("Apps"),
      url: "",
      icon: "flaticon-paper-plane",
      customData: new { MegaMenu = true }
)

1 Ответ

0 голосов
/ 18 ноября 2018

Это похоже на задание для словаря.

В провайдере навигации:

customData: new Dictionary<string, object>() { { "MegaMenu", true }, {"AnotherKey", "AnotherData"} }

Тогда его можно безопасно использовать в виде

var customData = menuItem.CustomData as Dictionary<string, object>;

if (customData != null && customData.TryGetValue("MegaMenu", out var megaMenu) && (bool)megaMenu)
{
  // MegaMenu true HTML
}
...