c# 如何把事件或表达式当参数来传递

publicclassClass1{publiceventTxDelegate<string>AcceptString;publicClass1(){ThreadHear... public class Class1
{
public event TxDelegate<string> AcceptString;
public Class1()
{
Thread HeartThread = new Thread(aathread);
HeartThread.IsBackground = true;
HeartThread.Start();
}
private void aathread()
{
int i = 0;
while (true)
{
i++;
Thread.Sleep(4000);
if (i == 10)
{
Form form = Application.OpenForms.Cast<Form>().FirstOrDefault();
if (form != null && form.InvokeRequired)
{
form.Invoke(new Action(() =>
{
AcceptString("你好");

}));

}
else
{
AcceptString("你好");
}
}
}
}
}
我想再写个方法 把这些代码放在这个方法里Form form = Application.OpenForms.Cast<Form>().FirstOrDefault();
if (form != null && form.InvokeRequired)
{
form.Invoke(new Action(() =>
{
AcceptString("你好");

}));

}
else
{
AcceptString("你好");
}
而把AcceptString("你好")这个当作参数怎么写一个方法;因为AcceptString("你好")这个我经常要变的 也许是别的事件
展开
 我来答
百度网友cfe4d0f
推荐于2017-10-09 · TA获得超过1502个赞
知道小有建树答主
回答量:937
采纳率:100%
帮助的人:867万
展开全部

事件是委托被封装后的状态  在外部调用的时候只能被限制了+=和-=运算符 

不能作为一个右值参数被使用


AcceptString("你好");这种写法也是不科学的  你应该专门写一个方法去触发事件 比如:

protected void OnAcceptString(string str) {
  if (this.AcceptString != null) {
    this.AcceptString(str)
  }
}


外部调用时直接使用OnAcceptString("你好") 这样可以达到一种安全调用的目的

不直接使用事件为参数就方便多了  后面就是你想要的答案:

public void DoInvoke(Action func) {
  Form form = Application.OpenForms.Cast<Form>().FirstOrDefault();
  if (form != null && form.InvokeRequired)
  {
  form.Invoke(func);
  }
  else
  {
     func();
  }
}

外部调用时直接  DoInvoke(()=>{OnAcceptString("你好");});  即可达到目的 (当然如果在类内部还可以直接调用事件)

追问
谢谢你,高手。你太强了,呵呵。但有个问题
外部调用时直接 DoInvoke(()=>{OnAcceptString("你好");}); 即可达到目的 (当然如果在类内部还可以直接调用事件) 好像在类内部也只能用 DoInvoke(()=>{OnAcceptString("你好");}); 用这个如果用 DoInvoke(OnAcceptString("你好")); 这样会显示参数不匹配!
追答
因为DoInvoke方法接受第一个参数是一个委托 类型为Action
而直接传入OnAcceptString("你好") 返回值是一个void 当然不匹配

所以要传入这么一个东西 ()=>{OnAcceptString("你好");} 它实质上是一个lambda表达式 并且符合Action类型的声明:delegate void Action()
鸢梨的小布丁
推荐于2017-09-20 · TA获得超过2.8万个赞
知道大有可为答主
回答量:2.3万
采纳率:21%
帮助的人:2227万
展开全部
不能将表达式作为一个参数传递进去,只能在方法里面预制一些表达式,然后在传递参数的时候,指定参数传递到哪个表达式。
举例
dim a as integer =1
public sub b(byval i as integer ,byval j as integer)
select case i
case 1
j=j+3
messagebox.show(j)
case 2
j=j*3
messagebox.show(j)
end select
end sub
这样的话,当调用b的时候
b(1,i)时,弹出的窗口显示的是4
b(2,i)时,淡出的窗口显示的是3
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式