求助:在做抽象类委托事件时候传值

凌風 2020-02-27 03:57:41
这个是身份证读卡器的抽象类,在读到数据后读卡结束事件怎么把数据传到程序中

/// <summary>
/// 定义delegate对象
/// </summary>
/// <param name="sender">事件发送者,为 IDCardReader 对象</param>
/// <param name="e">事件参数</param>
public delegate void ReadCardCompleted(object sender, ReadCardCompletedEventArgs e);

/// <summary>
/// 读卡结束事件
/// </summary>
public event ReadCardCompleted OnReadCardCompleted;



/// <summary>
/// 停止读卡
/// </summary>
public void Stop()
{
shouldStop = true;
if (ExternalSyncEvent != null) ExternalSyncEvent.Set();
}

/// <summary>
/// 线程池回调方法
/// </summary>
/// <param name="state">回调方法要使用的信息对象</param>
private void CardReaderCallback(Object state)
{
InnerIsAlive = true;
try
{
// 读取身份证
while (true)
{
if (shouldStop) break;

// 等待外部同步信号
if (ExternalSyncEvent != null)
{
ExternalSyncEvent.WaitOne();
if (shouldStop) break;
}

// 验证卡
if (Authenticate() >= 0)
{ // 读基本信息
///不正常
if (ReadContent() >= 0)
{ // 存储身份证信息
ReadCardCompletedEventArgs Args = new ReadCardCompletedEventArgs();

if (File.Exists(CHMsgFileName))
{ // 文字信息
using (StreamReader sr = new StreamReader(CHMsgFileName, Encoding.Unicode, true))
{ // 提取数据
Retrieve(sr.ReadToEnd(), Args);
}
}

// 照片信息
if (((IDCardBiometrics)state & IDCardBiometrics.Photo) == IDCardBiometrics.Photo)
{
if (File.Exists(PhotoFileName))
{
using (FileStream fs = new FileStream(PhotoFileName, FileMode.Open, FileAccess.Read))
{
Args.Photo = new byte[fs.Length];
fs.Read(Args.Photo, 0, (int)fs.Length);
}
}
}

// 关闭读卡操作,等待下次信号
if (ExternalSyncEvent != null)
{
ExternalSyncEvent.Reset();
if (shouldStop) break;
}

// 处理读卡结束事件
if (OnReadCardCompleted == null)
{
OnReadCardCompleted(this, Args);

}
}
}
} // End While
}
catch (Exception exception)
{
// 阻止异常抛出
}
finally
{
InnerIsAlive = true;
}
}
...全文
343 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
凌風 2020-03-02
  • 打赏
  • 举报
回复
引用 4 楼 lindexi_gd的回复:
[quote=引用 2 楼 凌風 的回复:]
[quote=引用 1 楼 lindexi_gd 的回复:]
看你的代码可以在业务层监听 OnReadCardCompleted 事件的方式。假设你当前这个类是 Foo 类,而这个类里面有 OnReadCardCompleted 事件,那么可以这样写

Foo foo = new Foo();
foo.OnReadCardCompleted += Foo_OnReadCardCompleted ;
// 做一些事情

这里的 Foo_OnReadCardCompleted 是需要你自己实现的方法



那这个
if (OnReadCardCompleted == null)
{
OnReadCardCompleted(this, Args);
}

里面的Args的数据怎么在应用层取[/quote]

在 Foo_OnReadCardCompleted 方法的参数可以拿到。另外 Foo_OnReadCardCompleted 如果是作为按钮点击事件,我建议你重新创建一个事件,如下面代码

private void Button_OnClick(object sender, object args)
{
// 在这个事件里面可以调用 Foo_OnReadCardCompleted 方法,但是调用的时候的参数需要根据你的业务传入
}[/quote] 谢谢了,我试下
lindexi_gd 2020-02-28
  • 打赏
  • 举报
回复
引用 2 楼 凌風 的回复:
[quote=引用 1 楼 lindexi_gd 的回复:]
看你的代码可以在业务层监听 OnReadCardCompleted 事件的方式。假设你当前这个类是 Foo 类,而这个类里面有 OnReadCardCompleted 事件,那么可以这样写

Foo foo = new Foo();
foo.OnReadCardCompleted += Foo_OnReadCardCompleted ;
// 做一些事情

这里的 Foo_OnReadCardCompleted 是需要你自己实现的方法



那这个
if (OnReadCardCompleted == null)
{
OnReadCardCompleted(this, Args);
}

里面的Args的数据怎么在应用层取[/quote]

在 Foo_OnReadCardCompleted 方法的参数可以拿到。另外 Foo_OnReadCardCompleted 如果是作为按钮点击事件,我建议你重新创建一个事件,如下面代码

private void Button_OnClick(object sender, object args)
{
// 在这个事件里面可以调用 Foo_OnReadCardCompleted 方法,但是调用的时候的参数需要根据你的业务传入
}
凌風 2020-02-28
  • 打赏
  • 举报
回复
还有就是Foo_OnReadCardCompleted如果是按钮的单击事件的话怎么写
凌風 2020-02-28
  • 打赏
  • 举报
回复
引用 1 楼 lindexi_gd 的回复:
看你的代码可以在业务层监听 OnReadCardCompleted 事件的方式。假设你当前这个类是 Foo 类,而这个类里面有 OnReadCardCompleted 事件,那么可以这样写 Foo foo = new Foo(); foo.OnReadCardCompleted += Foo_OnReadCardCompleted ; // 做一些事情 这里的 Foo_OnReadCardCompleted 是需要你自己实现的方法
那这个 if (OnReadCardCompleted == null) { OnReadCardCompleted(this, Args); } 里面的Args的数据怎么在应用层取
lindexi_gd 2020-02-27
  • 打赏
  • 举报
回复
看你的代码可以在业务层监听 OnReadCardCompleted 事件的方式。假设你当前这个类是 Foo 类,而这个类里面有 OnReadCardCompleted 事件,那么可以这样写

Foo foo = new Foo();
foo.OnReadCardCompleted += Foo_OnReadCardCompleted ;
// 做一些事情

这里的 Foo_OnReadCardCompleted 是需要你自己实现的方法

111,119

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧