3

現在、次のような列挙型があります。

public enum ReferenceType
{
    Language = 1,
    Period = 2,
    Genre = 3
}

言語、期間、およびジャンルはすべて、データベース内のテーブルにマップするエンティティクラスです。また、エンティティクラスとほぼ1対1でマップするモデルクラスがあり、それをビューに表示します。

私もこのようなサービス方法を持っています:

List<Model> Get<Model, Entity>()
        where Model : BaseModel
        where Entity : BaseEntity;

私はそれを次のように呼び出すことができService.Get<LanguageModel, Language>()、データベースのテーブルLanguageからすべての行を返し、それらを自動的にLanguageModelsに変換し、それをビューに表示します。

Get()整数を渡すだけでメソッドのラッパーメソッドを作成したいのですが、Get()メソッドを呼び出して、エンティティとモデルのクラスタイプを自動的に入力します。唯一の問題は、この背後にある実際の実装に頭を悩ませるのに苦労していることです。

擬似コードは次の行に沿っています。

  1. 電話WrapperGet((int)ReferenceType.Genre)
  2. ラッパーメソッドは、エンティティタイプ(Genre)とモデルタイプ()をGenreModel解決します
  3. Get()解決されたエンティティとモデルタイプを使用してメソッドを呼び出すと、次のようになります。Get<GenreModel, Genre>()
  4. 結果を返す

これを実際にC#で実装するにはどうすればよいですか?

4

2 に答える 2

2

完全に一般的な方法を考えることはできません。最も簡単な方法は次のとおりです。

List<Model> WrapperGet(int type)
{
   switch (type)
   {
      case 1: return Get<LanguageModel, Language>();
      ....
   }
   return null;
}
于 2012-07-05T21:08:52.000 に答える
1

強く型付けされた結果が必要な場合は、列挙型または列挙型を渡すという考えを放棄し、直接int呼び出すか、次のようなメソッドを作成するように切り替える必要があります。Get

List<LanguageModel> GetLanguages() { return Get<LanguageModel, Language>(); }

弱い型付けがうまくいく場合は、Saeedのソリューションを使用しますが、動作させるには型を少し変更する必要があります。 Modelあなたの例ではジェネリック型だったので、おそらく彼はList<BaseModel>戻り型を意味していました。しかし、aList<LanguageModel>はそうではありませんList<BaseModel>!これを解決するには、リターンにするか、リターンにIEnumerable<BaseModel>変更するか、後で次のように変更します。GetList<BaseModel>return new List<BaseModel>(Get<...

于 2012-07-05T21:58:30.310 に答える