如何将表驱动方法与委托和字典一起使用



嗨,如果比较,我已经筋疲力尽了。 并切换大小写方法。 我已经阅读了下面的问题:

最佳表/枚举驱动方法调用系统

这种用法很好。看看维维克的回应。

我的用法在下面,但我不能这个。


namespace DelegateKavrami
{
    class Program
    {
        static void Main(string[] args)
        {
            new MyTest().Run();
            Console.Read();
        }
    }

    public class MyTest
    {
        public void Run()
        {
            MyMessageProcessor myProcessor = new MyMessageProcessor();
            myProcessor.Register(0, Sms);
            myProcessor.Register(1, Mms);
            myProcessor.ProcessMessage(1, Message.Sms);
        }
        public void Sms(Message message)
        {
            Console.WriteLine("Sms olarak gönderilen mesaj");
        }
        void Mms(Message message)
        {
            Console.WriteLine("Mms olarak gönderilen mesaj:");
        }
    }
    public class MyMessageProcessor
    {
        public delegate void ProcessMessageDelegate(Message message);
        Dictionary methods;
        public void Register(int messageType,
                              ProcessMessageDelegate processMessage)
        {
            methods[messageType] = processMessage;
        }
        public void ProcessMessage(int messageType, Message message)
        {
            if (methods.ContainsKey(messageType))
            {
                methods[messageType](message);
            }
        }
    }
    public enum Message
    {
        Sms,Mms
    }
}

但我的梦想

myProcessor.ProcessMessage(1)

我该如何使用它?上述代码运行后出错:对象引用未设置为对象的实例。ON 方法[消息类型] = 进程消息;

稍微

重构一下代码,而不是使用委托,模板模式应该更好:

public enum messageType
{
    Sms, Mms
}
public class Message
{
    public MessageType MessageType { get; get; }
    public string Data { get; set; } // assume data to be processed
}

interface IHandler
{
    void Process(Message message);
}
class SmsHander : IHandler
{
    void Process(Message message)
    {}
}
class MmsHander : IHandler
{
    void Process(Message message)
    {}
}
class MessageProcessor
{
    private Dictionary<MessageType, IHandler> 
                   handlers = new Dictionary<MessageType, IHandler>()
    {
        { MessageType.Sms, new SmsHander() },
        { MessageType.Mms, new MmsHander() },
    };
    public void Process(Message message)
    {
        handlers[message.MessageType].Process(message);
    }
}

因此,您可以致电:

var processor = new Processor();
processor.Process(message);

您的字典未实例化:

Dictionary methods;更改为:

Dictionary methods = new Dictionary();

您也可以通过调试轻松看到这一点

相关内容

  • 没有找到相关文章

最新更新