Неявное преобразование в Func

Допустим, у меня есть интерфейс IMyInterface<T> это просто описывает одну функцию:

public interface IMyInterface<T>
{
    T MyFunction(T item);
}

Я мог бы просто заменить это Func<T, T>, но я хочу интерфейс по смысловым причинам. Могу ли я определить неявное преобразование между этим интерфейсом и Func<T,T> так, чтобы я мог передать анонимный делегат или лямбду в качестве аргумента функции, которая принимает этот интерфейс в качестве параметра, как если бы я использовал Func<T,T> вместо?

Чтобы продемонстрировать, используя интерфейс, объявленный выше, я хочу функцию, подобную этой:

public T TestFunction<T>(IMyInterface myInterface, T value)
{
    return myInterface.MyFunction(value);
}

Что я могу назвать так:

TestFunction<string>( x => return x + " world", "hello");

И результатом будет "Привет мир".

1 ответ

Решение

Поскольку интерфейсы в C# не могут содержать определения операторов (или любых статических методов в этом отношении), я считаю, что ответ - нет. Альтернативой является использование класса (к сожалению, не может быть абстрактным, так как статические члены / операторы справедливы здесь не лучше, чем в интерфейсах). Это позволит вам определить implicit оператор преобразования и, следовательно, сможет использовать тип точно так, как вы указали.

В классе (который вы могли бы сделать virtual если требуется), вы бы определили это примерно так:

public class MyClass<T>
{
    public static implicit operator MyClass<T>(Func<T, T> func)
    {
        return new MyClass<T>() { MyFunction = func };
    }

    public MyClass()
    {
    }

    public Func<T, T> MyFunction
    {
        get;
        set;
    }
}

Ваше определение TestFunction тогда ваш вопрос должен работать именно так, как вы его закодировали.

public T TestFunction<T>(IMyInterface myInterface, T value)
{
    return myInterface.MyFunction(value);
}

И аналогично призыв к TestFunction:

TestFunction<string>(x => return x + " world", "hello");

Это может быть не совсем то, что вы ищете, но, тем не менее, оно достаточно близко, и, более того, скорее всего, лучшее, что вы сможете получить.

Другие вопросы по тегам