使用正确的参数动态调用方法

时间:2012-03-14 02:27:03

标签: c# .net dependency-injection inversion-of-control mef

首先,答案不是

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

:)即说,我有一些旧的通用代码,使用配置文件中的定义创建上下文菜单和热键处理程序,并使用.Invoke()执行实际方法,其中方法签名是预定义的,否则方法未执行

e.g。方法签名与这些参数相同

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

我必须重新编写代码以包含一些额外的功能,并希望具有类似Unity / MEF的功能,其中签名只能包含所需的参数,并且可以更改参数的顺序

e.g。代码可以更改为

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

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

寻找有关如何去寻找/在哪里寻找的指导

UPDATE - 定义在db中,可以像这样检索

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...
    }
}

但这些方法也需要一些自定义参数!任何想法?

1 个答案:

答案 0 :(得分: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;
    }
}

然后在其他地方你可以像这样导入“foo”的所有上下文菜单项:

[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,并使用键组合替换元数据。然后,当用户点击密钥组合时,您可以扫描具有正确元数据的导入的所有导入并执行该操作。