2009-11-16 3 views
82

Я хотел бы объявить «пустое» лямбда-выражение, которое делает, ну, ничего. Есть ли способ сделать что-то подобное без использования метода DoNothing()?Есть ли способ указать «пустое» выражение C# лямбда?

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

Есть ли какой-нибудь способ сделать это? Просто кажется, что вам не нужен метод do-nothing.

ответ

6

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

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

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

10

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

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

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

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

SomeMenuCommand = new RelayCommand(
       null, 
       x => CanSomeMenuCommandExecute()); 
+1

Это, вероятно, проверяется и, вероятно, бросить NRE. – Dykam

+0

Я думаю, что Dykam прав, но я просто не думал о передаче null :-) –

+1

Я не понимаю, почему это ниспровергается? Хорхе делает правильный вывод, хотя было бы небольшим усилием проверить его. – Cohen

12

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