Делегаты с переменным числом параметов
От: b099ard  
Дата: 20.02.11 11:40
Оценка:
Есть делегат типа:


delegate void abc(ref MySqlConnection dbconn,int a, int b);
abc f;


И две функции:

public void a(ref MySqlConnection dbconn,int a);
public void b(ref MySqlConnection dbconn,int a, int b);


Как присвоить переменной f сначала функцию a, а потом b?
Делал по статье здесь
Конструкция вида:

f = (abc)Delegate.CreateDelegate(
                type: typeof(abc)
                ,method: typeof(MainForm).GetMethod("a")
                );

Выполняется с ошибкой Error binding to target method.;
Re: Делегаты с переменным числом параметов
От: adontz Грузия http://adontz.wordpress.com/
Дата: 20.02.11 12:04
Оценка:
Здравствуйте, b099ard, Вы писали:

Замыкания должны помочь.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Делегаты с переменным числом параметов
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 20.02.11 13:38
Оценка: +1
Здравствуйте, b099ard, Вы писали:

B>Есть делегат типа:


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

delegate void abc(ref string dbconn,int a, int b);
public static void MethodA(ref string dbconn,int a)
{}
public static void MethodB(ref string dbconn,int a, int b)
{}
void Main()
{
    
    abc f;
    f = (ref string dbConn, int a, int b) => MethodA(ref dbConn, a);
    f = MethodB;
    
    string conn = "";
    // Если сейчас f указывает на MethodA, то третий параметр (2) будет просто 
    // проигнорирован
    f(ref conn, 1, 2);
}


Хотя разумной эта идея не кажется. Когда вы "присваиваете" вашей переменной f "указатель" на MethodA, вы игнорируете параметр b вашего исходного делегата. Я еще пойму вариант, когда ваш делегат abc содержал бы два параметра, и в случае "сохранения" в нем укзаателя на MethodB, вы бы использовали некоторый параметр по умолчанию для параметра b метода MethodB.

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