假设我有一个简单描述一个函数的接口IMyInterface<T>
:
public interface IMyInterface<T>
{
T MyFunction(T item);
}
我可以将其替换为Func<T, T>
,但出于语义原因我想要接口。我可以在该接口和Func<T,T>
之间定义隐式转换,以便我可以将匿名委托或lambda作为参数传递给接受此接口作为参数的函数,就像我使用Func<T,T>
一样代替?
为了演示,使用上面声明的接口,我想要一个这样的函数:
public T TestFunction<T>(IMyInterface myInterface, T value)
{
return myInterface.MyFunction(value);
}
我可以这样打电话:
TestFunction<string>( x => return x + " world", "hello");
结果将是“你好世界”。
答案 0 :(得分:3)
由于C#中的接口不能包含运算符的定义(或任何静态方法),我相信答案是 no 。另一种方法是使用一个类(不幸的是,不能抽象,因为静态成员/运算符在这里不比在接口中更好)。这样您就可以定义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");
这可能不是你想要的,但它仍然合理地接近,而且很可能是你能得到的最好的。