都说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");
}));
}