有没有一种方法来指定一个“空的”C # lambda 表达式?

我想声明一个“空的”lambda 表达式,它什么也不做。 有没有一种不需要 DoNothing()方法就可以做到这一点的方法?

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


private void DoNothing()
{
}


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

我这样做的目的只是控制我的 WPF 命令的启用/禁用状态,但这是一个边缘。也许现在对我来说还为时过早,但我想一定有办法像这样声明 x => DoNothing() lambda 表达式来完成同样的事情:

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

有什么方法可以做到这一点吗? 只是看起来没有必要需要一个什么都不做的方法。

56786 次浏览

假设您只需要一个委托(而不是一个表达式树) ,那么这应该可以工作:

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

(这不适用于表达式树,因为它有一个 报表主体。更多细节请参见 C # 3.0规范的4.6部分。)

这应该会奏效:

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

我不完全理解为什么需要 DoNothing 方法。

你就不能:

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

我想我会添加一些代码,我发现对这种情况很有用。我有一个 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);
Action DoNothing = delegate { };
Action DoNothing2 = () => {};

我过去常常将 Events 初始化为一个 do nothing 操作,这样它就不是 null,如果没有订阅就调用它,它将默认为“ do nothing function”,而不是 null 指针异常。

public event EventHandler<MyHandlerInfo> MyHandlerInfo = delegate { };