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("你好")这个我经常要变的 也许是别的事件 展开
{
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("你好")这个我经常要变的 也许是别的事件 展开
展开全部
事件是委托被封装后的状态 在外部调用的时候只能被限制了+=和-=运算符
不能作为一个右值参数被使用
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()
展开全部
不能将表达式作为一个参数传递进去,只能在方法里面预制一些表达式,然后在传递参数的时候,指定参数传递到哪个表达式。
举例
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
举例
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询