【问题标题】:Is it possible to define a generic lambda in C#?是否可以在 C# 中定义通用 lambda?
【发布时间】:2010-03-08 21:45:05
【问题描述】:

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

public void DoSomething()
{
    // ...

    Func<T> GetTypeName = () => T.GetType().Name;

    GetTypeName<string>();
    GetTypeName<DateTime>();
    GetTypeName<int>();

    // ...
}

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

【问题讨论】:

  • 你想做什么,究竟?请记住,lambda 表达式只是一个没有名称的函数,而变量(Func 或 Action)只是指向该函数的指针(委托)。如果您更具体地了解您的问题,也许我们可以提供更好的帮助。

标签: c# c#-3.0 lambda


【解决方案1】:

虽然 Jared Parson 的答案在历史上是正确的(2010 年!),但如果您搜索“通用 lambda C#”,这个问题是 Google 中的第一个热门问题。虽然 lambda 没有语法来接受额外的泛型参数,但您现在可以使用本地(泛型)函数来实现相同的结果。当它们捕获上下文时,它们几乎就是您要寻找的东西。

public void DoSomething()
{
    // ...

    string GetTypeName<T>() => typeof(T).GetType().Name;

    string nameOfString = GetTypeName<string>();
    string nameOfDT = GetTypeName<DateTime>();
    string nameOfInt = GetTypeName<int>();

    // ...
}

【讨论】:

  • 我修复了您的示例,以便它可以编译并明确定义的本地泛型函数返回一个字符串。希望您能接受我的更改。我从你的例子中学到了一些新东西!不幸的是,在 C# 编程指南中,主题 Local functions(在 C# 7.0 中添加)没有说明对泛型参数的支持。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    虽然您不能(还没有?)拥有通用 lambda(另请参阅 this answer 和对 this question 的评论),但您可以获得相同的 usage 语法。如果你定义:

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

    【讨论】:

      【解决方案4】:

      这只有在您的 DoSomething 方法是泛型或其类是泛型时才有可能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-15
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2010-09-25
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多