我想传递一个方法作为参数,以从我的程序中删除重复的代码。这是我想要的功能:
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());
这可能吗?
答案 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();
...
}