【C# 如何将方法作为方法参数之-----委托的运用】

 前言

        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、以上仅个人在学习过程中的理解,如有不错误请各位大佬指点指点。
 谢谢
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值