如何抽象(用Func?)部分函数

时间:2016-07-19 17:32:41

标签: c# .net

在DAL中使用Dapper我有大量重复代码:

using (var sqlConn = new NpgsqlConnection("..."))
{
    sqlConn.Open();
    // query
}

弄清楚如何抽象没有返回任何内容的查询很容易:

    private void OpenConn(Action<NpgsqlConnection> action)
    {
        using (var sqlConn = new NpgsqlConnection("...")
        {
            sqlConn.Open();
            action.Invoke(sqlConn);
        }
    }

你就这么称呼它:

OpenConn(x => x.Execute("INSERT INTO ..."));

但我不知道如何重写OpenConn函数,以便你可以从它返回结果,即在另一个函数内返回int:

public int Example() {
    return OpenConn<int>(x => x.Query<int>("...").First());
}

public int Example() {
    OpenConn<int>(x => return x.Query<int>("...").First());
}

2 个答案:

答案 0 :(得分:3)

也许是这样的:

private TResult OpenConn<TResult>(Func<NpgsqlConnection, TResult> query)
{
    using (var sqlConn = new NpgsqlConnection("...")
    {
        sqlConn.Open();
        return query(sqlConn);
    }
}

呼叫:

public int Example() 
{
    return OpenConn<int>(x => return x.Query<int>("...").First());
}

答案 1 :(得分:3)

使用此语法为OpenCon定义重载。

public int OpenConn(Func<NpgsqlConnection, int> func)
{
    using (var sqlConn = new NpgsqlConnection("...")
    {
        sqlConn.Open();
        return func(sqlConn);
    }
}

OpenConn现在接收作为参数的委托给接收连接并返回整数的函数。

你称之为从OpenCon中返回查询结果

public int Example() 
{
   int result = OpenConn(x => return x.Query<int>("...").First());
}