我有一个主窗口,在这个主窗口内,有一个菜单部分(我的程序引用了MaterialDesignInXamlToolKit,但我想这与我的问题无关)。
因为程序需要有点超级灵活和超级可扩展,所以菜单项不是通过代码定义的。每个MenuItem都基于一个视图的Namespace.Name,存储在数据库中。
要打开menuitem,会有一个操作然后调用方法,因此视图将在标签项中打开。
Action ac = new Action(() => Open<Xyz.Maschine.VerwaltungView>(item.Bezeichnung));
(item.Bezeichnung指的是将在标签中显示为标题的名称)
我的问题是Xyz.Maschine.Verwaltung。这是我对我的观点的一个参考文献,我不知道在那个时间点(加上它只是看起来错误创建我的菜单项修复)。它应该自动填写,具体取决于所选的菜单项。所以我尝试了很多东西,但是这个似乎解释了我想要弄清楚的东西:
string strac = item.NamespacePassForm + "." + item.PassFormView;
Action ac = new Action(() => Open<strac>(item.Bezeichnung));
如果您需要更多详细信息,我会编辑帖子并添加更多代码。
答案 0 :(得分:0)
您无法使用通用方法执行此操作,但您可以执行以下操作:
开放(strac,item.Bezeichnung)
然后在Open方法中使用Type.GetType(strac)从字符串中获取Type。 strac必须是一个完全合格的类名。获得Type后,您可以通过各种方式动态创建对象(反射,表达式树,IL,Activator.CreateInstance等)。
答案 1 :(得分:0)
再次感谢您的帮助,我终于解决了以下问题(代码以防万一有人正在寻找相同的答案)。
首先我将Open()方法更改为Open(strac,item.Bezeichnung)
_menuItems = new List<MenuItem>();
var ListMenuPunkte = new LibNHibernate.Model.
MOD_MenuPunkt(LibNHibernate.Global.SessionManager.
CreateSession()).Holen();
foreach (var item in ListMenuPunkte)
{
string strac = string.Format("{0}.{1}",
item.NamespacePassForm,item.PassFormView);
_menuItems.Add(new MenuItem(item.Bezeichnung, "",
new Action(() => Open(strac, item.Bezeichnung))));
}
另外,我将通用方法更改为:
private void Open(string qualifiedClassName, string title)
{
_viewCreatedSubject.OnNext(new ViewContainer(title,
Activator.CreateInstance(Type.GetType(qualifiedClassName))));
}
所以现在它正常工作,打开我的观点:)