Можно ли прикрепить метод к делегату с предопределенными параметрами? - PullRequest
3 голосов
/ 30 декабря 2011

Иногда я сталкиваюсь со случаями, когда мне приходится присоединять метод к делегату, но подпись не совпадает, например, пытаться присоединить abc вниз к некоему делегату с параметром строки «hi».

public class test
{
   //...
   public void abc(int i, string x)
   {
      //Do Something
   }
   //...
}
public class test2
{
   somedelegate x;
   //...
   public test2()
   {
      //Do Something
      test y = new test();
      x += y.abc(,"hi");
   }
   delegate void somedelegate(int i);
}

Я могу обойти это, создав другого делегата с правильной подписью, а затем прикрепив его, но это кажется излишне сложным. Можете ли вы сделать что-то подобное в C #? Спасибо.

РЕДАКТИРОВАТЬ: я думаю, что самое близкое к тому, что я хотел достичь, это:

x += (int i) => abc(i, "hi");

Ответы [ 2 ]

2 голосов
/ 30 декабря 2011

Да, вы можете сделать это с помощью замыканий

[на msdn есть хорошая тема для обсуждения, но, как и все остальное, ее трудно найти]

Большая картинка

  • Напишите метод, который может принимать все необходимые параметры
  • Внутри этого метода вы возвращаете анонимный метод с целевой подписью делегата, для которой требуется
  • Вызов этого метода сам по себе параметр в экземпляре делегата

Да, это немного Matrix-y. Но круто.

delegate void somedelegate (int i);

protected somedelegate DelegateSignatureAdapter ( string b, bool yesOrNo, ...) {
    // the parameters are local to this method, so we'll go w/ that.

    // our target delegate requires a single int parameter and void return
    return  (int a) => {
                // your custom code here
                // all calling arguements are in scope - use them as needed

    };  // don't forget the semicolon!
}

// our delegate call
somedelegate myWarpedDelegate = new somedelegate (DelegateSignatureAdapter("someString", true));
myWarpedDelegate (2543);
myWarpedDelegate(15);
2 голосов
/ 30 декабря 2011

Just Googling для «дополнительных параметров делегата .net» возвращает некоторые результаты, которые могут быть полезны:

Обновление (более подробно исследуем это и помогли по первой ссылке выше):

Не могли бы вы использовать Invoke метод, который принимает любой делегат?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...