0

DBには4つのテーブルがあり、それぞれにIdとNameがありますが、それらは異なるものを表しています。「もの」ごとに異なるクラスがあり、それらはすべて「もの」から継承します。私は4つの機能を持っています:

List<thing1> getAllThings1();
List<thing2> getAllThings2();
List<thing3> getAllThings3();
List<thing4> getAllThings4();

各関数は異なるテーブルから読み取り、必要なリストを作成します。

コードの重複を避けたいので、テーブル名(文字列として)とタイプ(thing1、thing2 ...など)を受け取り、を返すユーティリティ関数を作成したいと思いましたList<t>

残念ながら、これは不可能です(反映なしで): 変数タイプのリストを作成します

私の現在の解決策は、リストを返す関数を持っていることです。各「getAllThings#」で彼女を呼び出し、ConvertAllを使用してコンバーターを渡すことにより、リスト内の各「もの」を手動で適切なものに変換します。

私はこの解決策が好きではありません。リストを作成して新しいリストを作成するので、それは間違っていると感じます。非常に非効率的です。それを行うためのより良い方法はありますか?

ありがとう

4

2 に答える 2

5

ジェネリックを使用してみませんか?

public IList<T> GetAllThings<T>(string tableName) where T : Thing {
    return new List<T>();
}

あなたはそれを呼び出すことができるようになります

IList<Thing4> things4 = thingProvider.GetAllThing<Thing4>( "thing4Table" );

タイプごとにテーブル名を格納するためのディクショナリを作成することもできるため、メソッドにテーブル名を指定する必要はありません。

于 2012-05-26T22:07:08.070 に答える
1

これを素早く汚してみてください。実際のものではなく、エラーが含まれている可能性がありますので、参考にしてください。

すべての共通属性を持つものの基本クラスを作成します

abstract ThingBase
{
   protected abstract   int Id {get;set;}
   protected abstract   string Name {get;set;}
}

そのベースを4つのクラスに実装します

public Thing1 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing2 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing3 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}
public Thing4 :ThingBase
{
   public int Id {get;set;}
   public string Name {get;set;}
}

4つすべてのリストを含むヘルパークラスをもう1つ作成します

public class YourThings
{
    public IList<Thing1> thing1 {get;set;}
    public IList<Thing2> thing2 {get;set;}
    public IList<Thing3> thing3 {get;set;}
    public IList<Thing4> thing4 {get;set;}

}

次に、SPに4つの異なる選択クエリを記述し、それをデータレイヤーのデータセットとしてキャッチします。テーブルを抽出し、それぞれのリストに入力して、yourthingクラスをUIレイヤーに戻します。

public YourThings FunctionToReturnSingleYourThing()
{
}

YourThingsのコレクションが必要な場合は、ロジックを再構築して、次のように返します。

public List<YourThings> FunctionToReturnMultipleYourThings()
{
}
于 2012-05-26T22:39:56.927 に答える