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

时间:2016-09-02 04:17:55

标签: c# dynamic action material-design-in-xaml

我有一个主窗口,在这个主窗口内,有一个菜单部分(我的程序引用了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));

如果您需要更多详细信息,我会编辑帖子并添加更多代码。

2 个答案:

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

所以现在它正常工作,打开我的观点:)