2009-05-27 53 views
4

比方说,我有一个接口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"); 

其结果将是“世界你好”。

+1

您是否打算在第二个代码块中调用IMyInterface.MyFunction()? – Andy 2009-05-27 19:48:58

+0

是的,谢谢。固定。 – 2009-05-27 19:50:01

回答

2

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

这可能不是正是你要寻找的,但它仍然相当接近,而且极有可能是最好的,你就可以要得到。