首页 > 解决方案 > 从 MenuItemDefinition.CustomData 获取属性的更好方法

问题描述

我正在使用来自 ASP.NETBoilerplate Navigation 的 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'

我看过这篇建议使用的帖子,InternalsVisibleTo但他在测试用例中使用它,我不确定在生产中使用它是否是个好主意。

编辑:

这是 MenuItemDefinition 和 customData 属性的样子

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

标签: c#objectc#-4.0asp.net-coreaspnetboilerplate

解决方案


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

在导航提供程序中:

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
}

推荐阅读