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

本文关键字:方法 另一个 参数传递 一个 | 更新日期: 2023-09-27 18:21:04

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

 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());

这可能吗?

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

使用Action委托。

更改

private void sqlQuery(Method sqlMethod)

进入

private void sqlQuery(Action sqlMethod)

sqlQuery(insertTemplate());

进入

sqlQuery(insertTemplate);

您可以通过委托来实现这一点。

例如动作:

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();
    }
}

是的,但略有不同。。。

试试这个:

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

并像这样声明sqlQuery:

private void sqlQuery(Action sqlMethod)

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

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

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

  • 可以对不返回值的委托使用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
});

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

这里有一个简单的例子:

public void SomeMethod(Action<string> passedMethod)
{
    passedMethod("some string");
}
public void Caller()
{
    SomeMethod(x => Console.WriteLine(x));
}

如果你运行"调用者",它会输出"一些字符串"。

Delegates就是答案->Microsoft on C#Delegates

public void delegate MyDelegate();
MyDelegate del = this.insertTemplate;
private void sqlQuery(MyDelegate sqlMethod)
{
 ...
 del();
 ...
}