有没有办法指定一个“空”的C#lambdaexpression式?

我想声明一个“空的”lambdaexpression式,没有什么。 有没有办法做这样的事情,而不需要DoNothing()方法?

  public MyViewModel() { SomeMenuCommand = new RelayCommand( x => DoNothing(), x => CanSomeMenuCommandExecute()); } private void DoNothing() { } private bool CanSomeMenuCommandExecute() { // this depends on my mood } 

我这样做的意图只是控制我的WPF命令的启用/禁用状态,但这是一个旁白。 也许这对我来说太早了,但是我想一定有办法像这样以某种方式声明x => DoNothing() lambdaexpression式来完成同样的事情:

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

有没有办法做到这一点? 似乎没有必要使用无所事事的方法。

 Action doNothing = () => { }; 

这是一个古老的问题,但我想我会添加一些我发现这种情况有用的代码。 我有一个dynamic静态类和一个Functions静态类与他们的一些基本function:

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

这应该工作:

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

假设你只需要一个委托(而不是一个expression式树),那么这应该工作:

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

(这对于expression式树来说是无效的,因为它有一个语句体 ,详细信息请参阅C#3.0规范的4.6节。)

我不完全明白你为什么需要一个DoNothing方法。

你不能只是做:

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