前言
C# 如何将方法作为方法参数之-----委托的运用
偶然看到halcon中给绘制对象绑定事件的方式,是将方法作为参数传递进去。然后用指针操作(当然那个先不深入了解)。
如何将方法作为参数传递呢,当然是用委托。
1、创建一个消息模型MessageModel(MessageEventsModel):作为委托中的参数。
2、创建一个消息发送者SqlMessageSender :模拟操作,然后将操作消息发送出去。3、创建一个消息接收者MessageReceiver:接收发送者发送的消息。
4、在程序如何Main中创建发送者(SqlMessageSender)和接收者(MessageReceiver)对象。
5、将接收方法作为参数传入发送者创建的OnMessageUpdate方法中。OnMessageUpdate(messageReceiver.MessageReceivedCallback);
运行结果
代码
internal static class Program
{
static void Main()
{
SqlMessageSender sqlMessageSender = new SqlMessageSender();
MessageReceiver messageReceiver = new MessageReceiver();
sqlMessageSender.OnMessageUpdate(messageReceiver.MessageReceivedCallback);
sqlMessageSender.Add();
sqlMessageSender.Delete();
sqlMessageSender.Update();
sqlMessageSender.Query();
}
}
#region 消息接收者
public class MessageReceiver
{
public void MessageReceivedCallback(MessageEventsModel messageModel)
{
Console.WriteLine($"【{this.GetType().Name}】=>接收到消息【{messageModel.Message},消息等级:{messageModel.Level}】");
}
}
#endregion
#region 消息发布者
public class SqlMessageSender
{
private MessaegeUpdateCallbackClass InternalFunc;
public void OnMessageUpdate(MessaegeUpdateCallbackClass func)
{
InternalFunc = func;
func?.Invoke(new MessageEventsModel(MessageLevel.Info, $"回调方法传递"));
}
public void Add()
{
OnFunc("添加");
}
public void Delete()
{
OnFunc("删除");
}
public void Update()
{
OnFunc("修改");
}
public void Query()
{
OnFunc("查询");
}
private void OnFunc(string message)
{
InternalFunc?.Invoke(new MessageEventsModel(MessageLevel.Info, $"执行:{message} "));
}
}
#endregion
#region 消息
/// <summary>
/// 消息委托
/// </summary>
public delegate void MessaegeUpdateCallbackClass(MessageEventsModel MessageModel);
/// <summary>
/// 消息事件委托
/// </summary>
public class MessageEventsModel
{
public string Message { get; set; }
public MessageLevel Level { get; set; }
public MessageEventsModel(MessageLevel level, string message)
{
Level = level;
Message = message;
}
}
/// <summary>
/// 消息等级枚举
/// </summary>
public enum MessageLevel
{
/// <summary>
/// 无异常
/// </summary>
None = 0,
/// <summary>
/// 信息
/// </summary>
Info,
/// <summary>
/// 警告
/// </summary>
Warning,
/// <summary>
/// 错误
/// </summary>
Error,
/// <summary>
/// 致命错误
/// </summary>
Fatal,
}
#endregion
总结
1、以上仅个人在学习过程中的理解,如有不错误请各位大佬指点指点。
谢谢