在另一个方法中将方法作为参数传递

时间:2013-07-03 14:00:03

标签: c#

我想传递一个方法作为参数,以从我的程序中删除重复的代码。这是我想要的功能:

 private void sqlQuery(Method sqlMethod)
{
    conn.ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
    try
    {
        //open SQL connection
        conn.Open();
        sqlMethod();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.Write(ex.ToString());
    }
    finally
    {
        conn.Close();
    }
}

使用:

private void insertTemplate()
{
    //create SQL command
    SqlCommand insertTemplate = new SqlCommand("INSERT INTO [SavedDescriptionTemplates] (SavedDescription, UserId, CreatedDate) VALUES (@descriptionParam, @userIdParam, @createdDateParam)", conn);
    //create and assign parameters
    insertTemplate.Parameters.AddWithValue("@descriptionParam", descriptionInput.Text);
    insertTemplate.Parameters.AddWithValue("@userIdParam", Int32.Parse(userNameDropDown.SelectedItem.Value));
    insertTemplate.Parameters.AddWithValue("@createdDateParam", DateTime.Now);
    //execute command and retrieve primary key from the above insert and assign to variable
    insertTemplate.ExecuteNonQuery();
}

电话会是:

sqlQuery(insertTemplate());

这可能吗?

7 个答案:

答案 0 :(得分:4)

使用Action代表。

更改

private void sqlQuery(Method sqlMethod)

private void sqlQuery(Action sqlMethod)

sqlQuery(insertTemplate());

sqlQuery(insertTemplate);

答案 1 :(得分:1)

是的,但略有不同......

试试这个:

sqlQuery(insertTemplate); // don't CALL the method, just name it

并像这样声明sqlQuery:

private void sqlQuery(Action sqlMethod)

答案 2 :(得分:1)

您可以通过代表实现这一目标。

例如使用Action

private void sqlQuery(Action action)
{
    conn.ConnectionString = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
    try
    {
        //open SQL connection
        conn.Open();

        action();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.Write(ex.ToString());
    }
    finally
    {
        conn.Close();
    }
}

答案 3 :(得分:1)

查看delegates。在您的情况下,由于您的方法不带参数,您可以使用内置的Action委托:

private void sqlQuery(Action sqlMethod)
{
    //...
}

sqlQuery(insertTemplate);

答案 4 :(得分:1)

C#中的逻辑块作为delegates传递。声明委托有多种方法 - 您可以定义自定义委托,或使用预定义类型之一:

  • 您可以将Action<...>用于不返回值的代理,或
  • 您可以将Func<...,R>用于返回值的代理。

以下是定义代理函数的一种方法:

private void sqlQuery(Action<IDbConnection> sqlMethod) {
   ...
   sqlMethod(conn);
   ...
}

使用命名或匿名委托调用sqlQuery,该委托可以内联定义,作为命名方法或作为lambda表达式定义:

// Using some method that takes IDbConnection
sqlQuery(MySqlMethod);
// Using an anonymous delegate
sqlQuery((conn) => {
    ... // Do something with conn
});

答案 5 :(得分:1)

是。您需要使用委托,匿名函数或lambda表达式。

这是一个简单的例子:

public void SomeMethod(Action<string> passedMethod)
{
    passedMethod("some string");
}

public void Caller()
{
    SomeMethod(x => Console.WriteLine(x));
}

如果您运行“来电者”,则会输出“某个字符串”。

答案 6 :(得分:0)

代表是答案 - &gt; Microsoft on C# Delegates

public void delegate MyDelegate();

MyDelegate del = this.insertTemplate;

private void sqlQuery(MyDelegate sqlMethod)
{
 ...
 del();
 ...
}