1

我目前正在使用 C# 处理 ASP.NET MVC 4 项目。

我想创建一个扩展方法,它接受各种类型的方法,将这些方法包装在 atry/catch中,然后如果调用成功则返回方法调用的结果。

这是我到目前为止所拥有的:

  public static object HandleServerError(this object obj)
        {
            object result = null;
            try
            {
                result = obj;
            }
            catch (Exception ex)
            {
                ErrorHandlers.ThrowServerErrorException(ex);
            }

            return result;
        } 

下面是一个正在使用的扩展方法的例子:

var test = webClient.DownloadString(uri).HandleServerError().ToString();

这工作正常,但该webClient.DownloadString(uri)部分被执行,然后作为一个字符串传入HandleServerError,这不是我想要的。

我想要做的是webClient.DownloadString(uri)注入扩展方法,以便将实际的方法调用包装到 try/catch 中。

请注意

我意识到有反对 try/catch 语句的论点,但不打算就这个主题展开辩论——这个问题的核心集中在依赖注入问题上。感谢所有的答案!

4

3 回答 3

3

你需要做的是传递一个委托。 Func在这里会有意义:

public static T HandleServerError<T>(Func<T> func)
{
    T result = default(T);
    try
    {
        result = func();
    }
    catch (Exception ex)
    {
        ErrorHandlers.ThrowServerErrorException(ex);
    }

    return result;
} 

然后你可以这样称呼它:

int test = HandleServerError(() => 0);

或者

string test = HandleServerError(webClient.DownloadString(uri));

(您仍然可以将其保留为扩展方法,但我认为它更有意义,并且更容易用作非扩展方法。)

于 2012-09-27T18:39:31.827 回答
3

我唯一能想到的是:

public static T HandleServerError<T>(this Func<T> action) 
{ 
    T result = default(T);
    try
    {
        result = (T)action();
    }
    catch (Exception ex)
    {
        ErrorHandlers.ThrowServerErrorException(ex);
    }

    return result;
}

然后你可以这样称呼它:

var test = new () => { return WebClient.DownloadString(uri); }.HandleServerError().ToString();

唯一的问题是您最终可能会遇到很多这样的需求,以便您可以处理所有不同类型的需求,但可能没什么大不了的。

于 2012-09-27T18:42:10.140 回答
1

您需要为回调(a Func<T>)创建扩展方法,而不是对象。

像这样的东西:

static class FuncExtensions  {
    public static T HandleServerError<T>(this Func<T> func) {
        T result = default(T);
        try {
            result = func();
        }
        catch (Exception ex) {
            // Handle exception here.
        }
        return result;
    }
}

在使用中,它看起来像这样:

new Func<string>(() => webClient.DownloadString(uri)).HandleServerError();

但是,使用常规方法调用可能比扩展方法更好地实现整个事情。

于 2012-09-27T18:48:32.110 回答