1

現在、C#を使用してASP.NETMVC4プロジェクトで作業しています。

try/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)、拡張メソッドにINJECTを実行して、実際のメソッド呼び出しが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

Func<T>オブジェクトではなく、コールバック (a) の拡張メソッドを作成する必要があります。

このようなもの:

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 に答える