Отправка сообщений между классами с помощью Func Delegates - PullRequest
0 голосов
/ 22 октября 2011

Я могу попытаться использовать делегат func для отправки сообщений другому классу. Обычно я делаю это с обычным делегатом, но я пытаюсь научиться делать это с Func. В приведенном ниже примере я хочу, чтобы AClass обновлял основной класс сообщениями. Как видите, у меня проблемы.

Обновлено: Я обновил пример, чтобы улучшить детализацию. В примере я показываю, как я использую делегата для связи с основным классом. Можно ли это сделать с помощью делегата func?

class Program
{
    static void Main(string[] args)
    {
        AClass aClass = new AClass();
        // old way
        aClass.MessageEvent += new AClass.MessageEventHandler(ProcessMessage);
        aClass.MessageSender(50);

        // new way
        Func<int, String> fDelegate = aClass.MessageSender;            
        Console.WriteLine(fDelegate(10));
        Console.ReadLine();
    }

    public static void ProcessMessage(String mess) {

        Console.WriteLine("Process message here: " + mess);
    }
}

class AClass {

    public event MessageEventHandler MessageEvent;
    public delegate void MessageEventHandler(String value);

    public AClass() {           
    }

    public String MessageSender(int i) {

        InvokeMessage("Message: " + i);
        return "Message: " + i;                                
    }

    public void InvokeMessage(String mess) {

        this.MessageEvent("Message sent via delegate: " + mess);
    }
}

Выход:

Process message here: Message sent via delegate: Message: 50
Process message here: Message sent via delegate: Message: 10
Message: 10

Любой совет приветствуется. ТНХ

1 Ответ

1 голос
/ 22 октября 2011

Мне кажется, я понимаю, чего вы пытаетесь достичь.Из того, что я понимаю, вы хотите использовать делегата для обработки данных в главном классе из AClass.Есть много способов сделать это даже с общими делегатами, но вот один пример:

    static void Main(string[] args)
    {
        AClass aClass = new AClass();
        aClass.MessageDelegate = ProcessMessage;
        // Send Message (writing of output unnecessary as it happens via the delegate anyway)
        Console.WriteLine(aClass.MessageSender(50));

        Console.ReadLine();
    }

    /// <summary>
    /// Used as delegate (messages passed from AClass to here)
    /// </summary>
    /// <param name="mess"></param>
    public static void ProcessMessage(String mess)
    {
        Console.WriteLine("Process message here: " + mess);
    }

    class AClass
    {
        public Action<string> MessageDelegate
        { get; set; }

        public AClass()
        {
        }

        public String MessageSender(int i)
        {
            InvokeMessage("Message: " + i);
            return "Message: " + i;
        }

        public void InvokeMessage(String mess)
        {
            if (MessageDelegate != null)
            {
                MessageDelegate(mess);
            }                
        }
    }

Это соответствует вашему предыдущему делегированию события, так как для него не требуется выходной параметр.В этом основное отличие Action <'Tin> от Func <' Tin, Tout>.Если вы хотите, чтобы ваш метод основного класса возвращал данные обратно вызывающей стороне делегата, тогда вы должны использовать Func.Если я что-то пропустил в ваших требованиях, пожалуйста, дайте мне знать.

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