从动作调用具有动态类型的方法
Call method with dynamic type from action
我有一个主 window,在这个主 window 中,有一个菜单部分(我的程序引用了 MaterialDesignInXamlToolKit,但我想这与我的问题无关)。
因为程序需要超级灵活和超级可扩展,所以菜单项没有通过代码定义。每个 MenuItem 基于一个视图的 Namespace.Name,存储在数据库中。
要打开菜单项,有一个调用方法的操作,因此视图将在选项卡项中打开。
Action ac = new Action(() => Open<Xyz.Maschine.VerwaltungView>(item.Bezeichnung));
(item.Bezeichnung指的是将在tab中显示为header的名称)
我的问题是Xyz.Maschine.Verwaltung。这是对我当时不知道的观点的固定引用(另外,创建我的菜单项修复似乎是错误的)。它应该会自动填写,具体取决于所选的菜单项。所以我尝试了很多很多东西,但这一个似乎解释了我想弄清楚的东西:
string strac = item.NamespacePassForm + "." + item.PassFormView;
Action ac = new Action(() => Open<strac>(item.Bezeichnung));
如果您需要更多详细信息,我将编辑 post 并添加更多代码。
你不能用通用方法做到这一点,但你可以这样做:
打开(strac, item.Bezeichnung)
然后在 Open 方法中使用 Type.GetType(strac) 从字符串中获取类型。不过,strac 必须是完全限定的 class 名称。拥有 Type 后,您可以通过各种方式动态创建对象(反射、表达式树、IL、Activator.CreateInstance 等)。
再次感谢您的帮助,我终于解决了问题如下(代码以防万一有人正在寻找相同的答案)。
首先我将 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))));
}
所以现在它工作得很好,打开我的视图:)
我有一个主 window,在这个主 window 中,有一个菜单部分(我的程序引用了 MaterialDesignInXamlToolKit,但我想这与我的问题无关)。
因为程序需要超级灵活和超级可扩展,所以菜单项没有通过代码定义。每个 MenuItem 基于一个视图的 Namespace.Name,存储在数据库中。
要打开菜单项,有一个调用方法的操作,因此视图将在选项卡项中打开。
Action ac = new Action(() => Open<Xyz.Maschine.VerwaltungView>(item.Bezeichnung));
(item.Bezeichnung指的是将在tab中显示为header的名称)
我的问题是Xyz.Maschine.Verwaltung。这是对我当时不知道的观点的固定引用(另外,创建我的菜单项修复似乎是错误的)。它应该会自动填写,具体取决于所选的菜单项。所以我尝试了很多很多东西,但这一个似乎解释了我想弄清楚的东西:
string strac = item.NamespacePassForm + "." + item.PassFormView;
Action ac = new Action(() => Open<strac>(item.Bezeichnung));
如果您需要更多详细信息,我将编辑 post 并添加更多代码。
你不能用通用方法做到这一点,但你可以这样做:
打开(strac, item.Bezeichnung)
然后在 Open 方法中使用 Type.GetType(strac) 从字符串中获取类型。不过,strac 必须是完全限定的 class 名称。拥有 Type 后,您可以通过各种方式动态创建对象(反射、表达式树、IL、Activator.CreateInstance 等)。
再次感谢您的帮助,我终于解决了问题如下(代码以防万一有人正在寻找相同的答案)。
首先我将 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))));
}
所以现在它工作得很好,打开我的视图:)