7

假设我有一个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(x => x + " world", "hello");

结果将是“hello world”。

4

1 回答 1

4

由于 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");

这可能不是您正在寻找的确切内容,但它仍然相当接近,而且很可能是您能够获得的最好的。

于 2009-05-27T19:42:38.153 回答