2

プログラムから繰り返しコードを削除するために、メソッドを引数として渡したいと考えています。これは私が望む機能です:

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

これは可能ですか?

4

7 に答える 7

4

Actionデリゲートを使用します。

変化する

private void sqlQuery(Method sqlMethod)

の中へ

private void sqlQuery(Action sqlMethod)

sqlQuery(insertTemplate());

の中へ

sqlQuery(insertTemplate);
于 2013-07-03T14:02:44.793 に答える
1

デリゲートを調べます。あなたの場合、メソッドはパラメーターをとらないため、組み込みのActionデリゲートを使用できます。

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

sqlQuery(insertTemplate);
于 2013-07-03T14:03:55.277 に答える
1

C# のロジック ブロックはdelegatesとして渡されます。デリゲートを宣言する方法はいくつかあります。カスタムの方法を定義するか、定義済みの型のいずれかを使用できます。

  • Action<...>値を返さないデリゲートに使用できます。または
  • Func<...,R>値を返すデリゲートに使用できます。

デリゲートを取る関数を定義する 1 つの方法を次に示します。

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

sqlQueryインライン、名前付きメソッド、またはラムダ式として定義できる名前付きまたは匿名のデリゲートを使用して呼び出します。

// Using some method that takes IDbConnection
sqlQuery(MySqlMethod);
// Using an anonymous delegate
sqlQuery((conn) => {
    ... // Do something with conn
});
于 2013-07-03T14:04:27.697 に答える
1

うん、でもちょっと違う…

これを試して:

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

そして、次のように sqlQuery を宣言します。

private void sqlQuery(Action sqlMethod)
于 2013-07-03T14:03:14.343 に答える
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();
    }
}
于 2013-07-03T14:03:19.463 に答える
1

はい。デリゲート、匿名関数、またはラムダ式を使用する必要があります。

簡単な例を次に示します。

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

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

「Caller」を実行すると、「何らかの文字列」が出力されます。

于 2013-07-03T14:05:05.633 に答える
0

デリゲートが答えです - > C#デリゲートのマイクロソフト

public void delegate MyDelegate();

MyDelegate del = this.insertTemplate;

private void sqlQuery(MyDelegate sqlMethod)
{
 ...
 del();
 ...
}
于 2013-07-03T14:06:14.530 に答える