Использование Common Delegate для вызова нескольких методов разных классов - PullRequest
1 голос
/ 21 декабря 2010

Мне нужно передать делегат и имя метода, которое делегат должен вызвать в качестве аргумента конструктора класса. Как мне это сделать ??

т.е. если

public delegate object CCommonDelegate();

является моим делегатом и говорит, что может вызывать любые методы после этой подписи

string Method1();

object Method2();

class X
{
    public X(CCommonDelegate,"MethodName to invoke"){}  //how to pass the Method name here..

}

P.S: игнорировать модификаторы доступа

Ответы [ 2 ]

4 голосов
/ 21 декабря 2010

Делегат - это переменная, которая содержит то, что может быть вызвано. Если X - это класс, который должен иметь возможность вызывать что-либо, то все, что ему нужно, это делегат:

public delegate object CommonDelegate();

class X
{
    CommonDelegate d;

    public X(CommonDelegate d)
    {
        this.d = d; // store the delegate for later
    }
}

Позже он может вызвать делегата:

var o = d();

Кстати, вам не нужно определять такого делегата. Тип Func<Object> уже существует и имеет правильную структуру.

Чтобы построить X, используйте два примера:

string Method1()
object Method2()

Вы могли бы сказать

var x = new X(obj.Method2);

Где obj - это объект класса, который имеет Method2. В C # 4 вы можете сделать то же самое для Method1. Но в 3 вам нужно конвертировать, используя лямбду:

var x = new X(() => obj.Method1);

Это потому, что тип возвращаемого значения не совсем тот же: он связан с наследованием. Это будет работать автоматически только в C # 4 и только если вы используете Func<object>.

2 голосов
/ 21 декабря 2010

почему бы просто не заставить ваш конструктор взять Func <объект>

public class x
{
     public x(Func<object> func)
     {
           object obj = func();
     }
}

затем

x myX = new x(()=> "test");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...