2017-09-12 35 views
-1

我創建了一個通用任務界面從通用的限制從

public interface ICalcLoaderTask 
{ 
    Task<T> Execute<T>(BaseTaskParameters taskParams, CancellationToken cancellationToken) where T : CalcLoaderTaskResult; 
} 

而且從CalcLoaderTaskResult

public class CopyNMStoreResult : CalcLoaderTaskResult 
{ 
    public string NMStoreResultsFilePath { get; set; } 
} 

衍生我在執行ICalcLoaderClass的一類任務派生收益類,我想不出一個返回結果類的方法

public async Task<T> Execute<T>(BaseTaskParameters taskParams, CancellationToken cancellationToken) where T : CalcLoaderTaskResult 
    { 
     var copyFileTaskParams = (CopyFilesTaskParameters)taskParams; 
     var GlobalNMStoreResultsFilePath = string.Format("{0}\\WhateverTheFileNameIs.xls", copyFileTaskParams.GlobalShareFolderPath); 
     var LocalNMStoreResultsFilePath = string.Format("{0}\\WhateverTheFileNameIs.xls", copyFileTaskParams.GlobalShareFolderPath); 

     await FileUtility.CopyFileAsync(GlobalNMStoreResultsFilePath, LocalNMStoreResultsFilePath, cancellationToken); 

     var result = new CopyNMStoreResult 
     { 
      NMStoreResultsFilePath = GlobalNMStoreResultsFilePath 
     }; 
     return result; //Cannot implicitly convert type 
    } 

如何返回thi sresult?或者我的模式不正確?我將用從CalcLoaderTaskResult派生的不同返回類型重新使用這種類型的模式。 CalcLoaderTaskResult是抽象

+0

您的函數不會返回一個'Task'或一個'T'類型的對象。爲什麼有兩個而不是'CopyNMStoreResult'或'CalcLoaderTaskResult'作爲返回類型? –

+3

如果你想讓這個方法只返回一個特定的類型,那麼不要使它成爲通用的;使方法通用表明調用者可以提供他們想要指示應返回的內容的任何類型。 – Servy

+0

我想創建一個可重用的界面。我需要重複這種模式25次,並希望有一個通用的界面來執行任務。返回類型會有所不同,但都來自CalcLoaderTaskResult –

回答

1

由於您的實現總是返回相同類型的對象,我會制定不同的接口

public interface ICalcLoaderTask<T> 
    where T : CalcLoaderTaskResult 
{ 
    Task<T> Execute(BaseTaskParameters taskParams, CancellationToken cancellationToken) 
} 

即類型(接口)是通用的而不是方法。

然後讓你的執行落實具體類型

public class MyImplementation : ICalcLoaderTask<CopyNMStoreResult> 
{ 
    public async Task<CopyNMStoreResult> Execute(BaseTaskParameters taskParams, 
               CancellationToken cancellationToken) 
    { 
     ... 
     var result = new CopyNMStoreResult 
     { 
      NMStoreResultsFilePath = GlobalNMStoreResultsFilePath 
     }; 
     return result; 
    } 
} 

因爲主叫方可以不選擇返回值的類型呢。

這在技術上是可能讓開

public class MyImplementation<T> : ICalcLoaderTask<T> where T ... 

但因爲你的方法的返回類型是硬編碼,有這樣做沒有任何優勢的泛型類型參數。


注意:可以讓一個方法返回不同的類型。添加通用類型約束new允許您使用new T()創建一個對象。約束new意味着類型T必須具有默認構造函數。

T MyMethod<T>() 
    where T : MyBase, new 
{ 
    return new T(); 
} 
+0

工作。自從我不得不寫TAP以來已經有一段時間了。試圖爲其他開發人員實施標準模式,因爲將有20或30個類似的任務具有不同的返回類型,這些任務都是從基本返回類型派生的。謝謝,這有幫助。 –