我想创建一个简单的单行try / catch而不需要额外的绒毛:
// The extension class
public static class TryExFunc
{
public static Exception TryEx<TResult> (this Func<TResult> func,
out TResult result)
{
Exception error = null;
try
{
result = func();
}
catch(Exception ex)
{
error = ex;
result = default(TResult);
}
return error;
}
}
// My Error Prone Function
public string SayHello() { throw new Exception(); }
// My Code
// One (ok, two) line(s) to try/catch a function call... ew, works, but ew
string result;
Exception error = ((Func<string>)SayHello).TryEx<string>(out result);
// I want to do this!!!
string result;
Exception error = SayHello.TryEx<string>(out result);
有没有办法可以做最底层的例子?我还在学习C#(来自Lua和C ++背景)。 Lua有一个非常好的功能,名为&#39; pcall&#39;基本上做同样的事情。感谢您的任何建议或建议!
:)
答案 0 :(得分:2)
你做不到。因为method group
没有类型。它可以转换为不同的delegate
类型。因此,在使用它之前,必须将其强制转换为委托类型。
如果你想避免演员,你可以这样做:
Func<string> sayHello = SayHello;
Exception error = sayHello.TryEx<string>(out result);
答案 1 :(得分:0)
它不能用作扩展方法,因为为了使用扩展方法,C#首先需要知道要扩展的类型,正如@ Selman22所述,SayHello是一个方法组,可能有其他重载,所以我们不知道类型。
它用作方法调用,因为C#可以看到所需的参数是Func<T>
而SayHello是有效的Func<T>
以下格式适用于调用该功能。
string result;
Exception error = TryExFunc.TryEx(SayHello, out result);
我同意@Enigmativity,你可能不应该这样对待例外。