行動

2011-05-09 19 views
2

我使用的是具有以下(略)方法的第三方庫類隱式轉換我創建了一個抽象第三方依賴關係的包裝類。所以,我想要做的是有一個包裝方法如下所示:行動

public void MyDoSomethingAsync(Action<MyResultInfo> callback) 
{ 
    this.wrappedClass.DoSomethingAsync(callback); 
} 

的問題是,我需要的callback參數轉換從Action<MyResultInfo>Action<ResultInfo>。這是可能的自定義隱式轉換運算符還是有別人可以推薦的替代方法?

回答

1

不,你不能直接這樣做,即使MyResultInfo來自ResultInfo; delegate contravariance不會適用於這裏的Action<MyResultInfo>將無法​​處理來自ResultInfo派生的任何實例

但是(以便來自地方的Action<ResultInfo>的使用不夠格的Action<MyResultInfo>),這並不意味着你可以」 t使用適配器,如下所示:

public void MyDoSomethingAsync(Action<MyResultInfo> callback) 
{ 
    // Create the action which will transform ResultInfo 
    // into MyResultInfo and then pass to the wrapped 
    // class. 
    // Create the action first. 
    Action<ResultInfo> a = ri => { 
     // Translate ri into MyResultInfo. 
     MyResultInfo mri = (translate here); 

     // Call the callback with the translated result. 
     callback(mri); 
    }; 

    // Pass the action to the wrapped class. 
    this.wrappedClass.DoSomethingAsync(a); 
} 
+0

我傾向於不同意第一個陳述,因爲與代表的反作用正好相反,'動作'可以轉換成'動作' – Andrey 2011-05-09 15:23:31

+0

第二件事是你將點鏈接到非泛型委託反轉, t爲'Action '工作,泛型代表反轉僅在.net 4.0中引入。 – Andrey 2011-05-09 15:26:59

+0

@Andrey:修正了一切。 – casperOne 2011-05-09 15:31:33

0

問題是,您要做什麼可能會導致不一致。我認爲MyResultInfo源自ResultInfo,否則它沒有任何意義。

現在回到不一致。想象一下,你有代表Action<ResultInfo> callback。調用代碼可以這樣調用它:callback(new MyResultInfo());並且打電話給你的Action<MyResultInfo>,它會正常工作。但想象一下,它被這樣調用:callback(new ResultInfo());,Action<ResultInfo>允許它,但它會產生異常,因爲ResultInfo不能轉換爲MyResultInfo