2012-03-14 59 views
0

首先,答案是不動態調用方法與正確的參數

.Invoke("name", new object[] { }); 

:)他這樣說,我有一個創建使用從定義上下文菜單和快捷鍵處理一些舊的通用代碼配置文件並使用.Invoke()方法執行實際方法,其中方法簽名是預定義的,否則該方法不執行

例如該方法簽名都是相同的這些論點

change_back_color(mycontext ctx, object sender, controlItemClickEventArgs e) 
    { 
      //...   
    } 

我不得不返工的代碼,包括一些額外的功能,並希望有統一/ MEF一樣的功能,其中籤名只能包含必要的參數和參數順序可以改變

例如代碼可以改爲

[FunctionKey("myKey1")] 
    change_back_color(object sender, mycontext ctx) 
    { 
      //...   
    } 

[FunctionKey("myKey1")] 
    change_back_color(mycontext ctx) 
    { 
      //...   
    } 

尋找如何去了解它指導/在哪裏看

更新 - 這些定義中,可以像檢索數據庫所以

var commands = dbContext.GetCommands("current_view_name") ; // return method key, user roles etc. 

// and i can use the following to match to "current_view_name" 
[ImportMany(RequiredCreationPolicy=CreationPolicy.NonShared)] 
public IEnumerable<Lazy<MenuItem,IDictionary<string,object>> MenuItems 
{ 
    set 
    { 
     var fooMenuItems = value 
      .Where(x => x.Metadata["ContextTarget"] == "current_view_name") 
      .Select(x => x.Value); 
     // attach fooMenuItems to some context menu... 
    } 
} 

但這些方法還需要一些自定義參數!有任何想法嗎 ?

+0

爲什麼你確定答案不是'.Invoke(「name」,new object [] {sender,context});'? – 2012-03-14 02:44:35

+0

@ M.Babcock - 問題是如何使用正確的參數調用.Invoke(),pref。使用MEF/Unity/AutoFac like方法調用生成器 – Kumar 2012-03-14 03:35:06

回答

0

如果你想上下文菜單動態添加到通過MEF您的應用程序,我會做這樣的事情:

[Export(typeof(MenuItem)] 
[ExportMetadata("ContextTarget", "foo")] 
public FooMenuItemForBarAction 
{ 
    get 
    { 
     var menuItem = new MenuItem("BarAction"); 
     menuItem.Click += delegate 
     { 
      // code to handle click here 
     } 
     return menuItem; 
    } 
} 

然後在其他地方,你可以導入所有的「富」這樣的上下文菜單項:

[ImportMany(RequiredCreationPolicy=CreationPolicy.NonShared)] 
public IEnumerable<Lazy<MenuItem,IDictionary<string,object>> MenuItems 
{ 
    set 
    { 
     var fooMenuItems = value 
      .Where(x => x.Metadata["ContextTarget"] == "foo") 
      .Select(x => x.Value); 
     // attach fooMenuItems to some context menu... 
    } 
} 

熱鍵處理程序,你可以做同樣的事情:改變導出/導入類型爲Action並通過組合鍵取代的元數據。然後,當用戶點擊組合鍵時,您可以掃描具有正確元數據的導入的所有導入並執行該操作。

+0

有趣的想法,將def在另一個地方使用這個,但這裏的Q有點不同,因爲如何以正確的順序調用右參數的方法 – Kumar 2012-03-15 19:26:41

+0

@kumar:你還在根據Interop.Invoke思考。正如我所演示的,您不需要這種動態方法調用來使應用程序可插入。 MEF要求您有一個預定義的合同,由插件導出並由插件主機導入。 – 2012-03-15 20:33:13

+0

我想說的是,你有一個屬性得到的地方,因爲我需要一個方法調用各種參數!我將在Q上面更新 – Kumar 2012-03-16 09:36:17