web-dev-qa-db-ja.com

「空の」C#ラムダ式を指定する方法はありますか?

何もしない「空の」ラムダ式を宣言したいと思います。 DoNothing()メソッドを必要とせずにこのようなことをする方法はありますか?

_    public MyViewModel()
    {
        SomeMenuCommand = new RelayCommand(
                x => DoNothing(),
                x => CanSomeMenuCommandExecute());
    }

    private void DoNothing()
    {
    }

    private bool CanSomeMenuCommandExecute()
    {
        // this depends on my mood
    }
_

これを行う目的は、WPFコマンドの有効/無効状態を制御することだけですが、それは別です。私にとっては早すぎるかもしれませんが、同じことを達成するために、このような方法でx => DoNothing()ラムダ式を宣言する方法があるに違いないと思います。

_    SomeMenuCommand = new RelayCommand(
        x => (),
        x => CanSomeMenuCommandExecute());
_

これを行う方法はありますか?何もしない方法は必要ないように思えます。

102
Rob
Action doNothing = () => { };
209
Rauhotz

これは古い質問ですが、この種の状況に役立つコードをいくつか追加すると思いました。 Actions静的クラスといくつかの基本的な関数を含むFunctions静的クラスがあります。

public static class Actions
{
  public static void Empty() { }
  public static void Empty<T>(T value) { }
  public static void Empty<T1, T2>(T1 value1, T2 value2) { }
  /* Put as many overloads as you want */
}

public static class Functions
{
  public static T Identity<T>(T value) { return value; }

  public static T0 Default<T0>() { return default(T0); }
  public static T0 Default<T1, T0>(T1 value1) { return default(T0); }
  /* Put as many overloads as you want */

  /* Some other potential methods */
  public static bool IsNull<T>(T entity) where T : class { return entity == null; }
  public static bool IsNonNull<T>(T entity) where T : class { return entity != null; }

  /* Put as many overloads for True and False as you want */
  public static bool True<T>(T entity) { return true; }
  public static bool False<T>(T entity) { return false; }
}

これは読みやすさをほんの少し改善するのに役立つと思います:

SomeMenuCommand = new RelayCommand(
        Actions.Empty,
        x => CanSomeMenuCommandExecute());

// Another example:
var lOrderedStrings = GetCollectionOfStrings().OrderBy(Functions.Identity);
20
Anthony

これは動作するはずです:

SomeMenuCommand = new RelayCommand(
    x => {},
    x => CanSomeMenuCommandExecute());
10
Joseph

(式ツリーではなく)デリゲートのみが必要な場合、これは機能するはずです。

SomeMenuCommand = new RelayCommand(
        x => {},
        x => CanSomeMenuCommandExecute());

(これはstatement bodyがあるため、式ツリーでは機能しません。詳細については、C#3.0仕様のセクション4.6を参照してください。)

7
Jon Skeet

DoNothingメソッドが必要な理由が完全にはわかりません。

あなただけではできません:

SomeMenuCommand = new RelayCommand(
                null,
                x => CanSomeMenuCommandExecute());
1
Jorge Córdoba