2016-09-02 8 views
0

メインウィンドウがあり、このメインウィンドウの内側にメニューセクションがあります(私のプログラムはMaterialDesignInXamlToolKitを参照していますが、私の質問には関係ありません)。アクションからの動的型のメソッドを呼び出す

プログラムはいくぶんsuper flexibeとsuper extensibleである必要があるので、メニュー項目はコードで定義されていません。各MenuItemは、データベースに格納されている1つのビューのNamespace.Nameに基づいています。

メニューアイテムを開くには、メソッドが呼び出され、ビューがタブアイテムで開きます。

Action ac = new Action(() => Open<Xyz.Maschine.VerwaltungView>(item.Bezeichnung));

(item.Bezeichnungタブにヘッダとして表示される名前を参照)

私の問題はXyz.Maschine.Verwaltungあります。その時点で私が知りません(私のメニュー項目を修正するのは間違っていると思われます)。選択したメニュー項目に応じて自動的に入力する必要があります。だから私は、多くの多くのものを試してみましたが、この1は私が把握しようとしていますかを説明するようだ:

string strac = item.NamespacePassForm + "." + item.PassFormView; 
Action ac = new Action(() => Open<strac>(item.Bezeichnung)); 

あなたはより多くの詳細が必要な場合は、私はポストを編集して、いくつかのより多くのコードを入れます。

あなたが一般的な方法でそれを行うことはできませんが、あなたが何か行うことができます

答えて

0

オープン(strac、item.Bezeichnung)

をし、[開く]内Type.GetType(strac)を使用しますメソッドを使用して文字列からTypeを取得します。 stracは完全修飾クラス名でなければなりません。タイプを取得したら、さまざまな方法(リフレクション、エクスプレッションツリー、IL、Activator.CreateInstanceなど)でオブジェクトを動的に作成することができます。

+0

ありがとうあなたの答えは私に多くの助け:) – Veronica

0

あなたの助けをありがとう、私は最終的に次のように問題を解決しました(誰かが同じ答えを探している場合に備えて)。 、だから今それがうまく働いて

private void Open(string qualifiedClassName, string title) 
    { 
     _viewCreatedSubject.OnNext(new ViewContainer(title, 
      Activator.CreateInstance(Type.GetType(qualifiedClassName)))); 
    } 

まず私は(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)))); 
     } 

を開くには、Open()メソッドを変更プラス私はへの一般的な方法を変更しました私の意見を開く:)

関連する問題