从动作调用具有动态类型的方法

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))));
    }

所以现在它工作得很好,打开我的视图:)