Можно ли определить общую лямбду в C #? - PullRequest
20 голосов
/ 09 марта 2010

У меня есть некоторая логика в методе, который работает с указанным типом, и я хотел бы создать общую лямбду, которая инкапсулирует логику. Это дух того, что я пытаюсь сделать:

public void DoSomething()
{
    // ...

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

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

    // ...
}

Я знаю, что могу передать тип в качестве параметра или создать универсальный метод. Но мне интересно знать, может ли лямбда определять свои собственные общие параметры. (Поэтому я не ищу альтернативы.) Из того, что я могу сказать, C # 3.0 не поддерживает это.

Ответы [ 4 ]

15 голосов
/ 09 марта 2010

Невозможно создать лямбда-выражение, которое имеет новые общие параметры. Вы можете повторно использовать общие параметры для содержащих методы или типы, но не создавать новые.

2 голосов
/ 31 августа 2018

Хотя ответ Джареда Парсона является исторически правильным (2010 год!), Этот вопрос является первым хитом в Google, если вы ищете "универсальная лямбда C #". Хотя в лямбдах нет синтаксиса для принятия дополнительных универсальных аргументов, теперь вы можете использовать локальные (универсальные) функции для достижения того же результата. Поскольку они отражают контекст, они в значительной степени то, что вы ищете.

public void DoSomething()
{
    // ...

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

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

    // ...
}
1 голос
/ 25 июля 2017

Хотя вы не можете (пока?) Иметь общую лямбду (см. Также этот ответ и один комментарий к этому вопросу ), вы можете получить такое же использование синтаксис.Если вы определите:

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>();
    }
}
0 голосов
/ 09 марта 2010

Это возможно, только если ваш метод DoSomething является универсальным или его класс является универсальным.

...