通用函数的C#扩展方法

时间:2015-03-26 22:28:34

标签: c# generics try-catch extension-methods func

我想创建一个简单的单行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;基本上做同样的事情。感谢您的任何建议或建议!

:)

2 个答案:

答案 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,你可能不应该这样对待例外。