c# - 从 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 }
)
解决方案
这看起来像是字典的工作。
在导航提供程序中:
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
}
推荐阅读
- javascript - Bootstrap Modal appearing empty when reopened for a 2nd time
- javascript - React-konva 带箭头的双连接对象
- python - 从自动编码器定义编码器和解码器模型:ValueError:dense_3 层的输入 0 与该层不兼容:
- winapi - C++ 中的哪个 Windows API 将帮助我识别当前 ComboBox 正在使用哪个对话框类?
- javascript - 我想知道为什么这个表达式等于“失败”?
- angular - 避免使用 if 语句 NgRx Store
- javascript - 如何为多个选项卡处理一次服务人员消息?
- promise - Puppeteer 的 chromium 打开时出现错误并停止 puppeteer 脚本
- php - Laravel 5.8 重定向错误未显示消息
- ruby - 无法在单独的 ruby 文件中引用对象/实例变量以进行自动化测试