我正在使用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 }
)
答案 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
}