2012-12-07 59 views
2

任何避免在这种情况下明确声明MyMethodDelegate的方法?C# - 方法的自动委托类型

bool MyMethod(string x) 
{ 
    //... 
} 

BeginInvoke(new MyMethodDelegate(MyMethod), x); 

我知道lambda表达式一拉()=>MyMethod(x),但是我想,以避免它们有时他们打破编辑和继续。

编辑:只是BeginInvoke(MyMethod, x)不起作用:

The best overloaded method match for 'System.Windows.Forms.Control.BeginInvoke(System.Delegate, params object[])' has some invalid arguments 
Argument 1: cannot convert from 'method group' to 'System.Delegate' 
Argument 2: cannot convert from 'string' to 'object[]' 

BeginInvoke的定义如下:

public IAsyncResult BeginInvoke(Delegate method, params object[] args); 

它不指定任何特定的委托类型,所以编译器无法检测其委托类型来实例化BeginInvoke(MyMethod. x)

回答

3

对于框架> = 3.5,你可以使用预定义的代表行动<>和Func键<>(你的情况)

BeginInvoke(new Func<int, bool>(MyMethod), x); 

文档的Func键 http://msdn.microsoft.com/ru-ru/library/bb549151.aspx

+0

打我吧。尽管按照OP,'int'应该是一个'string'。 –

3

您可以经常使用简化ied版本

MyMethod 

当需要委托时。关键字是经常是

但是,如果编译器无法确定代表对方法组转换的哪个类型,你将不得不帮助用明确的转换

lambda表达式可以派上用场,当你要传递一个函数,你尚未在代码中的其他位置定义和需要。然后,Lambdas(以及一般的匿名函数)将非常方便,因为您可以在需要的地方简单定义函数。

你是正确的,因为在你不能,你需要通过铸造或分配方法组显式转换为代表的评论中所指出的BeginInvoke的情况下

Func<int,bool) m = MyMethod; 
BeginInvoke(m,x); 
BeginInvoke((Func<inte,bool>)MyMethod,x); 

将编译或你可以在一个lambda传递,因为这是解释为Func键

BeginInvoke(a=>MyMethod(a),x); 
+0

不工作,为的BeginInvoke()需要一个通用的委托。更新后。 –

+0

@IvanShcherbakov你写过你不能将MyMethod作为一个委托来传递__no__参数,因为MyMethod接受了这个参数。自从我写了“BeginInvoke”之后很长一段时间,但是如果你真的传递了一个参数,它可能会工作。 –

+0

为了简单起见,我已经把它留在这里了。我明显已经通过了实际的代码。 –