2011-06-27 57 views
0

我有多個數據源接口的實現。 它有一個方法CanGet可以用來發現它是否可以源自一個特定的類型,然後用另一個Get來執行它。 我試圖編碼這個特定的實現,但它確實喜歡從FindSource傳遞GetCostLedger,因爲類型不匹配。我看不到如何讓這個工作。 感謝您的幫助。將鍵入的Func返回爲通用Func

private Func<IEnumerable<T>> FindSource<T>() where T : class 
{ 
    if (typeof(CostLedger).IsAssignableFrom(typeof(T))) 
     return GetCostLedger; 

    if (typeof(EquipmentInventory).IsAssignableFrom(typeof(T))) 
     return GetEquipmentInventory; 

    if (typeof(ActivePavingJobs).IsAssignableFrom(typeof(T))) 
     return GetActivePavingJobs; 

    return null; 
} 

public IEnumerable<T> GetData<T>() where T : class 
{ 
    var source = FindSource<T>(); 
    if (source != null) 
     return source.Invoke(); 

    throw new NotImplementedException(); 
} 

public bool CanGet<T>() where T : class 
{ 
    return FindSource<T>() != null; 
} 

private IEnumerable<CostLedger> GetCostLedger() 
{ 
    //Implementation clipped 
} 

private IEnumerable<EquipmentInventory> GetEquipmentInventory() 
{ 
    //Implementation clipped 
} 

private IEnumerable<ActivePavingJobs> GetActivePavingJobs() 
{ 
    //Implementation clipped 
} 

的應用案例這個代碼是在運行了很多轉換的ETL過程 數據源是從工廠調用的實現注入,像這樣

_destination.SaveData(
    _mapper.Find<IEnumerable<CostLedger>, LaborAndEquipmentAnalysis>() 
       .Process(_source.First(x => x.CanGet<CostLedger>()) 
    .GetData<CostLedger>(), dashboardName, DateTime.UtcNow)); 
+0

澄清我的例子,以幫助解釋爲什麼我正在做我正在做的事情。 –

回答

-1

這是肯定不是這樣你爲什麼要在這個方法中使用開放式泛型類型做到這一點,但如果必須....

private Func<IEnumerable<T>> FindSource<T>() where T : class 
{ 
    if (typeof(CostLedger).IsAssignableFrom(typeof(T))) 
     return()=>GetCostLedger().Cast<T>(); 

    return null; 
} 
+0

@downvoter ...在行之間讀取,看起來這實際上是一個通用基類方法的'protected override'。如果你不喜歡答案,至少要解釋原因。 –

2

private Func<IEnumerable<T>> FindSource<T>() where T : class { 
    if (typeof(CostLedger).IsAssignableFrom(typeof(T))) 
     return GetCostLedger; 

    return null; 
} 

如果你正在返回一個封閉的泛型類型?

也就是說,你爲什麼讓這種方法工作,爲所有T其中T是,如果你真正使用它時TCostLedger引用類型?

在最低限度,如果你曾經想要是CostLedger及其派生類型,你應該說

private Func<IEnumerable<T>> FindSource<T>() where T : CostLedger 

不過說真的,我不明白爲什麼你不只是說

private Func<IEnumerable<CostLedger>> FindSource() 

如果您正在使用的所有TCostLedger

+0

CostLedger是我的例子,但它不是我唯一返回的例子,我有多個數據源接口的實現,每個實現只能實現某些類型。每個實施都要說明他們可以處理哪些問題。 –

+0

您的方法正文說'CostLedger'是您正在使用的唯一類型。 – jason