Есть ли способ указать "пустое" лямбда-выражение C #? - PullRequest
99 голосов
/ 16 ноября 2009

Я хотел бы объявить «пустое» лямбда-выражение, которое ничего не делает. Есть ли способ сделать что-то подобное без использования метода 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());

Есть ли способ сделать это? Просто кажется ненужным метод бездействия.

Ответы [ 5 ]

204 голосов
/ 16 ноября 2009
Action doNothing = () => { };
20 голосов
/ 28 декабря 2012

Это старый вопрос, но я подумал, что добавлю код, который я считаю полезным для такого типа ситуаций. У меня есть 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);
10 голосов
/ 16 ноября 2009

Это должно работать:

SomeMenuCommand = new RelayCommand(
    x => {},
    x => CanSomeMenuCommandExecute());
7 голосов
/ 16 ноября 2009

Если вам нужен только делегат (а не дерево выражений), тогда это должно сработать:

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

(Это не будет работать с деревьями выражений, поскольку у него есть тело оператора . Подробнее см. В разделе 4.6 спецификации C # 3.0.)

1 голос
/ 16 ноября 2009

Я не совсем понимаю, зачем вам метод DoNothing.

Разве вы не можете просто сделать:

SomeMenuCommand = new RelayCommand(
                null,
                x => CanSomeMenuCommandExecute());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...