假设我有一个接口(interface) IMyInterface<T>
简单地描述了一个功能:
public interface IMyInterface<T>
{
T MyFunction(T item);
}
我可以将其替换为 Func<T, T>
,但出于语义原因我想要接口(interface)。我可以定义该接口(interface)和 Func<T,T>
之间的隐式转换吗?这样我就可以将匿名委托(delegate)或 lambda 作为参数传递给接受此接口(interface)作为参数的函数,就像我使用了 Func<T,T>
一样。相反?
为了演示,使用上面声明的接口(interface)我想要一个这样的函数:
public T TestFunction<T>(IMyInterface myInterface, T value)
{
return myInterface.MyFunction(value);
}
我可以这样调用:
TestFunction(x => x + " world", "hello");
结果将是“hello world”。
最佳答案
由于 C# 中的接口(interface)不能包含运算符的定义(或与此相关的任何静态方法),我相信答案是不。另一种方法是使用一个类(不幸的是不能是抽象的,因为这里的静态成员/运算符公平并不比在接口(interface)中更好)。这将允许您定义隐式
转换运算符,因此能够精确地使用您指定的类型。
在类中(如果需要,您可以将其设为 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");
这可能不是您正在寻找的东西,但它仍然相当接近,而且很可能是您能够获得的最好的。
关于c# - 隐式转换为 Func,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/917616/