2009-05-27 104 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"); 

這可能不是正是你要尋找的,但它仍然相當接近,而且極有可能是最好的,你就可以要得到。