Вызов метода динамически с правильными аргументами - PullRequest
0 голосов
/ 14 марта 2012

во-первых, ответ не

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

:), как говорится, у меня есть некоторый старый общий код, который создает контекстные меню и обработчики горячих клавиш, используя определения из файла конфигурации, и выполняет фактическийметоды, использующие .Invoke (), где сигнатура метода предопределена или метод не выполняется

например, сигнатуры методов одинаковы с этими аргументами

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

Мне нужно переделатькод, который включает в себя некоторые дополнительные функции и хотел бы иметь функциональность, подобную Unity / 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...
    }
}

но эти методы также нуждаются в некоторых пользовательских аргументах!есть идеи?

1 Ответ

0 голосов
/ 15 марта 2012

Если вы хотите динамически добавлять контекстные меню в ваше приложение через 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 и заменить метаданные комбинацией клавиш. Затем, когда пользователь нажимает на ключевую комбинацию, вы можете отсканировать все импортированные данные с правильным метаданными и выполнить это действие.

...