泛型函数的 C# 扩展方法

C# Extension Methods for Generic Functions

我想创建一个简单的单行 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 有一个非常好的函数,叫做 'pcall',它基本上做同样的事情。感谢您的任何意见或建议!

:)

你不能。因为 method group 没有类型。它可以转换为不同的 delegate 类型。所以你必须在使用它之前将它转换为 delegate 类型。

如果你想避免转换,你可以这样做:

Func<string> sayHello = SayHello;
Exception error = sayHello.TryEx<string>(out result);

它不能用作扩展方法,因为为了使用扩展方法,C# 首先需要知道要扩展的类型,并且正如@Selman22 所述,SayHello 是一个可能具有其他重载的方法组,所以我们不知道类型。

它作为方法调用工作,因为 C# 可以看到所需的参数是 Func<T> 并且 SayHello 是有效的 Func<T>

下面的格式可以调用函数。

string result;
Exception error = TryExFunc.TryEx(SayHello, out result);

我同意@Enigmativity 的观点,您可能不应该以这种方式处理异常。