c#委托事件 自己理解

都说C#的委托与事件,对初学者来说很难,但是一跃过去就很简单了

单是我这个一跃不知道还要多久,为什么对有些人来说简单的事,我却那么难,好吧,这个是必须掌握的

需求:发卡器,我要去程序中调用发卡器的方法,得到卡的卡号信息

常人理解:很简单,卡一方,点下读取的事件就可以了

我:想把它做成公用的DLL,使用事件注册来实现读取卡号

1.新建类库 ReaderTest--》类Reader

 public Reader(){}-->构造函数(里面又写了连接发卡器的方法)

2.定义委托

 public delegate void ReaderEventHandler(CardInfo card);

3.定义事件

public event ReaderEventHandler ReaderEvent;

4.事件触发方法 

protected virtual void ReaderCard(CardInfo card)

{   //防止可能存在的多线程同步问题。

     ReaderCardHandler tmpEvent = ReaderCardEvent;
     if (tmpEvent != null)
     {
         tmpEvent(e);
      }
}
5.信息类
public class CardInfo
{
   //a,b属性略
   public CardInfo(string a,string b)
  {
     赋值略
   }
}

6.对外的方法界面类调用方法 实现事件数据传输通道口

public void GetCardInfo()

{

//逻辑方法处理处

           ulong CardNo;
            int CardType;
            int nRet = Card_ReadCardNo(&CardNo, &CardType);
            if (nRet == 0)
            {
                string cardno = CardNo.ToString("x8");
                string cardtype = CardType.ToString();
                CARDINFO card = new CARDINFO(cardno,cardtype);
                //传递事件方法
                ReadCard(card);
            }
            else
            {
                Console.WriteLine("无法连接一卡通");
            }

}

7。生成dll

8.界面类使用(添加完引用)

先实例化类

在LOAD里注册事件

  Reader.ReaderCardEvent += new XZX.ReaderSU.ReaderCard.ReaderCardHandler(ReadCard);

//ReadCard方法实现 与内部委托参数一致

private void ReadCard(XZX.ReaderSU.ReaderCard.CARDINFO e)
        {
            string cardno = e.CardNo;
            string cardtype = e.CardType;
           //更新界面元素
            this.Invoke(new Action(() =>
            {
                lblCardNo.Text = cardno;
                lblType.Text = cardtype;
                lblTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            }));
           
        }
原文地址:https://www.cnblogs.com/Gracedream/p/5139951.html