是否可以在C#中定义通用lambda?

我在一个操作指定类型的方法中有一些逻辑,我想创建一个封装逻辑的通用lambda。 这就是我想要做的精神:

public void DoSomething() { // ... Func GetTypeName = () => T.GetType().Name; GetTypeName(); GetTypeName(); GetTypeName(); // ... } 

我知道我可以将类型作为参数传递或创建generics方法。 但我很想知道lambda是否可以定义自己的通用参数。 (所以我不是在寻找替代方案。)据我所知,C#3.0不支持这一点。

无法创建具有新通用参数的lambda表达式。 您可以在包含的方法或类型上重用通用参数,但不能创建新的参数。

虽然你不能(但是?)有一个通用的lambda(另见这个答案和对这个问题的一个评论),你可以得到相同的用法语法。 如果你定义:

 public static class TypeNameGetter { public static string GetTypeName() { return typeof( T ).Name; } } 

你可以使用它(虽然using static是C#6):

 using static TypeNameGetter; public class Test { public void Test1() { var s1 = GetTypeName(); var s2 = GetTypeName(); } } 

只有当您的DoSomething方法是通用的或其类是通用的时,才可以执行此操作。

虽然Jared Parson的回答在历史上是正确的(2010年!),但如果您搜索“通用lambda C#”,这个问题将成为Google的第一个问题。 虽然lambdas没有接受其他generics参数的语法,但您现在可以使用本地(通用)函数来实现相同的结果。 当他们捕捉背景时,他们几乎就是你正在寻找的东西。

 public void DoSomething() { // ... T GetTypeName() => typeof(T).GetType().Name; GetTypeName(); GetTypeName(); GetTypeName(); // ... }