1

MVC3アプリ内で、ドロップダウンリスト(DDL)のレコードを取得する呼び出し用の一般的なクラス(以下ではDdlGetという名前)を作成しようとしています。以下のコードは意図したとおりに動作しますが、ジェネリック型Tの使用をオーバーベークしていると思います。具体的には、以下に「// **」で示されている行です。

コントローラに次のコードがあります

private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;
...
public StatusController() : this(...new StatusTypeRepository()) {}

public StatusController(...IGeneralReferenceRepository<StatusType> statusTypeRepository)
{
    ...
    this.statusTypeRepository = statusTypeRepository;
}
...
public ViewResult Index()
{
    ...
    //**** The line below passes a variable (statusTypeRepository) of the Generic
    //**** type (StatusType) and additionally calls the class (Helper<StatusType>)
    //**** with the Generic
    indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository);

次に、私のリポジトリで(これは、データベースからDDLのレコードを取得するための実装を定義します[Entity Frameworkメソッドを介して])-一般的な参照ジェネリックインターフェイス(IGeneralReferenceRepository)に注意してください

public class StatusTypeRepository : IStatusTypeRepository, IGeneralReferenceRepository<StatusType>
{
    ...
    public IQueryable<StatusType> All
    {
        get { return context.StatusTypes; }
    }

私はインターフェースを持っています(これは上記で呼び出されているAllメソッドに対応します)

public interface IGeneralReferenceRepository<T>
{
    IQueryable<T> All { get; }
}

ドロップダウンリストのレコードを取得してSelectListに配置するためのヘルパークラス

public class Helper<T>
{
   public static SelectList DdlGet(IGeneralReferenceRepository<T> generalReferenceRepository)
   {
       return new SelectList(generalReferenceRepository.All, ...);
   }
}

私が抱えている問題は、上記の最初のコードブロックに示されている行です。つまり、SelectListに入力される最終的な実装の呼び出しです。

indexViewModel.StatusTypes = Helper<StatusType>.DdlGet(statusTypeRepository); 

上記のコメントで説明されているように(接頭辞// * *)、これは次の行を介してタイプを定義するGenericstatusTypeRepositoryを渡します:-

private readonly IGeneralReferenceRepository<StatusType> statusTypeRepository;

ただし、私はすでにHelper Genericクラス(つまり、Helperクラス)で型を定義しています。

私が持っている質問は、呼び出しでジェネリックを2回指定するのではなく、一方を他方から導出できるかどうかです。つまり、statusTypeRepositoryで指定されたタイプをHelperクラスタイプから派生させることはできますか、またはその逆は可能です。


トラビスに感謝します

4

1 に答える 1

1

クラスにtypeパラメーターを設定するのではなくHelper、次のようにメソッドに配置することができます。

public class Helper
{
    public static SelectList DdlGet<T>(IGeneralReferenceRepository<T> generalReferenceRepository)
    {
        return new SelectList(generalReferenceRepository.All, ...);
    }
}

その後、あなたはただすることができます

indexViewModel.StatusTypes = Helper.DdlGet(statusTypeRepository); 

コンパイラは型推論を処理します。

于 2012-05-30T00:17:38.570 に答える