我在一个操作指定类型的方法中有一些逻辑,我想创建一个封装逻辑的通用lambda。这就是我想要做的精神:
public void DoSomething()
{
// ...
Func<T> GetTypeName = () => T.GetType().Name;
GetTypeName<string>();
GetTypeName<DateTime>();
GetTypeName<int>();
// ...
}
我知道我可以将类型作为参数传递或创建泛型方法。但我很想知道lambda是否可以定义自己的泛型参数。 (所以我不是在寻找替代方案。)据我所知,C#3.0不支持这一点。
答案 0 :(得分:15)
无法创建具有新通用参数的lambda表达式。您可以在包含的方法或类型上重用通用参数,但不能创建新的参数。
答案 1 :(得分:2)
尽管贾里德·帕森(Jared Parson)的答案在历史上是正确的(2010年!),但如果您搜索“通用Lambda C#”,则此问题会在Google中引起广泛关注。尽管没有语法允许lambda接受其他泛型参数,但是您现在可以使用局部(泛型)函数来获得相同的结果。当他们捕获上下文时,它们几乎就是您要寻找的。 p>
public void DoSomething()
{
// ...
string GetTypeName<T>() => typeof(T).GetType().Name;
string nameOfString = GetTypeName<string>();
string nameOfDT = GetTypeName<DateTime>();
string nameOfInt = GetTypeName<int>();
// ...
}
答案 2 :(得分:1)
虽然你不能(但是?)有一个普通的lambda(另见this answer和一个评论this question),你可以得到相同的用法语法。如果你定义:
public static class TypeNameGetter
{
public static string GetTypeName<T>()
{
return typeof( T ).Name;
}
}
您可以使用它(尽管using static
是C#6):
using static TypeNameGetter;
public class Test
{
public void Test1()
{
var s1 = GetTypeName<int>();
var s2 = GetTypeName<string>();
}
}
答案 3 :(得分:0)
仅当您的DoSomething
方法是通用的或其类是通用的时,才可以这样做。