【问题标题】:How can i use Table Driven methods with delegate and Dictionary? [closed]如何将表驱动方法与委托和字典一起使用? [关闭]
【发布时间】:2012-10-02 09:23:30
【问题描述】:

嗨,如果比较,我已经筋疲力尽了。和切换案例方法。我已阅读以下问题:

Best table / enum driven method calling system

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

我的用法如下,但我不能这样做。


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 方法[messageType] = processMessage;

【问题讨论】:

    标签: c# design-patterns delegates table-driven


    【解决方案1】:

    稍微重构你的代码,而不是使用委托,模板模式应该会更好:

    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);
    

    【讨论】:

    • 强乐;我想问个问题。我只依赖于处理方法。如果我想使用更多接口 IHandler2 也 Process2,Process3 方法。我怎样才能运行这个:handlers[message.MessageType].Process(message);
    • @programmerist:不明白你的意思,你能解释一下吗
    • 例如;我有 IHandler1、IHandler2、IHandler3 等。IHandler1 有 Method1()、Method2 等。我该怎么做:handlers[message.MessageType].Method1(message);还有 handlers[message.MessageType].Method2 (message);
    • @programmerist:你可以在你的界面上定义更多的方法
    【解决方案2】:

    您的字典未实例化:

    Dictionary methods; 更改为:

    Dictionary methods = new Dictionary();
    

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

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      相关资源
      最近更新 更多