从MenuItemDefinition.CustomData获取属性的更好方法

时间:2018-11-18 01:39:34

标签: c# object c#-4.0 asp.net-core aspnetboilerplate

我正在使用ASP.NET样板导航中MenuItemDefinition的customData属性来定义一些其他属性。

我可以使用以下代码访问属性

 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'

我看过this post,它建议使用InternalsVisibleTo,但是他在测试用例上使用它,我不确定在生产环境中使用它是一个好主意。

编辑:

这是MenuItemDefinition和customData属性的样子

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

1 个答案:

答案 0 :(得分:0)

这看起来像是字典的工作。

在导航提供程序中:

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
}