Неявное преобразование в 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");
Это может быть не совсем то, что вы ищете, но, тем не менее, оно достаточно близко, и, более того, скорее всего, лучшее, что вы сможете получить.