0

現在、MVC Webアプリのユーザーは、サーバーに対して一連のajax呼び出しを行うことができます。現在、グローバルラッパー/ハンドラーメソッドを使用せずに、それらすべてを一意に処理しています。これを変更したいのですが、C#の関数デリゲートの経験はあまりありません。

理想的には、次のように設計する必要があります。

public class GenericService
{
    public PageViewModel EditPage(PageViewModel model)
    {
        ....
    }

    public JsonResult JsonAjaxRequest(Func<Object, Object> serviceCall, Object data)
    {
        try
        {
            return new JsonResult() { Data = new { status = "ok", data = serviceCall(data) } };
        }
        catch
        {
            return new JsonResult() { Data = new { status = "error", message = "The server encountered an unknown error." } };
        }
    }

これでコントローラーに次のコードがあります。

private readonly GenericService _service;

public JsonResult PageEdit(PageViewModel model)
{
    return Json(_service.JsonAjaxRequest(x=>_service.EditPage(model), model));
}

cannot convert from method group to system.func<object, object>エラーとコンパイルエラーが発生し続けますが、そのinvalid arguments理由はわかりません。お知らせ下さい。

4

1 に答える 1

2

objectどこでも使用するのではなく、一般的な方法に変更することをお勧めします。

public JsonResult JsonAjaxRequest<TIn, TOut>(Func<TIn, TOut> serviceCall, TIn data)
{
    try
    {
        return new JsonResult() { Data = new { status = "ok", data = serviceCall(data) } };
    }
    catch
    {
        return new JsonResult() { Data = new { status = "error", message = "The server encountered an unknown error." } };
    }
}

これを使用すると、パラメーターとして指定したラムダまたはメソッド グループに基づいて、ジェネリック引数を推測できます。ラムダの場合は問題にならないはずですが、メソッド グループを直接渡すと、いくつかの特殊なケースに役立ちます。また、関数に指定するパラメーターは厳密に型指定されているため、キャストする必要がないことも意味します。

この変更を行った後に言及したようなコンパイラ エラーが発生する可能性がある唯一の方法は、1 以外のいくつかのパラメーター (つまり、0 または 2+) を受け入れるメソッドを使用した場合、または一部のパラメーターのvoid代わりに返された場合です。価値。

于 2013-02-13T21:18:52.157 に答える