2011-06-27 27 views
0

データソースインターフェイスの実装は複数あります。 CanGetは特定のタイプのソースを取得できるかどうかを検出するために使用され、別のGetはそれを実行するために使用されます。 私はこの特定の実装をそのようにコード化しようとしていますが、型が一致しないためにFindSourceからGetCostLedgerを戻すのが好きです。私はこれをどのように動作させるのか分かりません。 ありがとうございました。これは最も確かであるので汎用Funcとして型付きFuncを返す

_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; 

    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プロセスである データソースが実装と工場から呼び出されますではない、それを行うための方法がありますが、必要であれば....

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

なぜあなたはこの方法

にオープンジェネリック型を使用しています

閉じたジェネリックタイプを返す場合は、

TCostLedgerあるとき、あなたが実際にそれを使用している場合Tが参照型である場合には、なぜあなたはすべてのTのために、このメソッドの仕事をさせるされていますか?あなたが望むすべてがある場合は最低でも

CostLedgerとその派生型は、あなたが

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

を言う必要があります。しかし、本当に、私はあなただけ言っていない理由は見当たらない

private Func<IEnumerable<CostLedger>> FindSource() 
Tのすべてを CostLedgerに使用している場合は、

です。

+0

CostLedgerは私の例ですが、私が返す唯一のものではありません。データソースインターフェイスの複数の実装があり、それぞれが特定のタイプのみを満たすことができます。各実装が対応できるかどうかは、実装ごとに異なります。 –

+0

あなたのメソッド本文には、あなたが使用している唯一のタイプが「CostLedger」だと書かれています。 – jason

関連する問題