Могут ли методы делегата C # принимать неявно типизированные аргументы? - PullRequest
1 голос
/ 04 октября 2010

Мне любопытно, можно ли создать метод делегата с неявно типизированными аргументами.Вот что я пытаюсь сделать.Подобные вещи не будут компилироваться для меня, но они должны дать вам представление о том, чего я пытаюсь достичь.

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

class MyClass
{
    ArrayList function1(int param1, int param2)
    {
        ...do something...
    }
    ArrayList function2(string param3)
    {
        ...do something...
    }
}

А вот класс, который их вызывает:

class MyOtherClass
{
    delegate ArrayList delFunc(params object[] args);

    myOtherClass()
    {
        MyClass myClassInstance = new myClass();
        delFunc myDelFunc1 = myClassInstance.function1;
        delFunc myDelFunc2 = myClassInstance.function2;

        myDelFunc1(1,2);
        myDelFunc2("hello world");
    }


}

Очевидно, что в этом примере вы просто вызовете предоставленные функции.Что я на самом деле пытаюсь сделать, так это создать функцию-обертку, которая позволяет вам предоставить функцию в качестве делегата с любым возможным списком аргументов.

Единственное решение, которое я могу придумать, - это сделать функции вMyClass также принимает списки параметров.Однако это очень запутало бы любого, кто напрямую вызывает эти функции.Вот что я имею в виду:

class MyClass
{
    ArrayList function1(params object[] args)
    {
        ...do something...
    }
    ArrayList function2(params object[] args)
    {
        ...do something...
    }
}

Теперь он компилируется, но мне нужно угадать или прочитать комментарии, чтобы выяснить, что передать в function1 и function2.Кроме того, там, где он когда-то потерпел неудачу во время компиляции, теперь он не работает во время выполнения.Все очень плохие вещи ...

Я думаю, что может быть какой-то синтаксис, который мне не хватает, чтобы делать что-то подобное

delegate ArrayList delFunc(MatchAnyArgumentSignature);

Приветствия, Роб

1 Ответ

1 голос
/ 04 октября 2010

Просто используйте Действие или Действие :

public void Something(int arg1, int arg2, int arg3) {
  ...
}

и где-нибудь внутри метода:

Action<int, int, int>  call = Something; 
call(1, 2, 3);

Вы не можете использовать var в этом случае.

В любом случае, вам больше не следует использовать ArrayList.

Edit:

Если эти делегаты должны что-то вернуть, есть Func , Func

...