将一个方法作为另一个方法中的参数传递
本文关键字:方法 另一个 参数传递 一个 | 更新日期: 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();
...
}