0

現在、SQLクエリの結果からデータエンティティオブジェクトを作成するアプリケーションに取り組んでいます。データベースでは、3つのテーブルは非常に似ていますが、いくつかの異なるプロパティがあります。

私の最初の計画は、各クラスが非常に似ているにもかかわらず、3つの異なるクラスを作成することでした。しかし、オブジェクトのリストを返すメソッドを作成するようになったとき、アプリケーションがどのモードにあるかによって戻りのタイプが異なるため、つまずきにぶつかりました。

例えば

public class A
{
   public int Id {get;}
   public string Name {get;}
}

 public class B
 {
   public int Id {get;}
   public string Name {get;}
   public string ExtraInfo {get;}
 }


 public class MainScreen
 {
     ...
     this.resultsGrid.DataSource = LoadData();
 }

各データ型のリストをロードするための1つのメソッドを記述したくありません。LoadData()の戻り型は、可能な限り一般的なものにするために、どのようにする必要がありますか。

このシナリオに対処するための最もエレガントな方法は何ですか?

ありがとう、

ショーン

4

3 に答える 3

0

ポリモーフィズムを許可するには継承が必要です。これにより、データバインディングに含まれるすべてのエンティティが派生する基本クラスが作成されます。

次に、名前やIDなどの共有プロパティを持つミッドベースクラスを作成できます。

基本クラス:

public abstract class Entity
{
}

名前とIDを持つエンティティ:

public class NameAndIDEntity : Entity
{
    public int Id { get; set; }
    public string Name { get; set; }
}

名前、ID、ExtraInfoを持つエンティティ:

public class NameIDAndExtraEntity : NameAndIDEntity
{
    public string ExtraInfo { get; set; }
}

他の情報(NameAndIDEntityから派生することはできません)を持つエンティティは、エンティティから派生するため、データバインディングに含めることができます。

public class OtherInformationEntity : Entity
{
    public int Age { get; set; }
}

最後に、LoadDataリターンタイプをエンティティにすることができます。

于 2012-04-20T15:27:38.063 に答える
0

シンプル!

クラスを作成しますListItem(プロパティIdName、と思います)。ファクトリクラス/メソッドで、レコードからそのクラスのインスタンスを作成しList、データソースをリストにバインドします。

UI専用のクラスを作成することを恐れないでください。

更新:言及するのを忘れました。継承はできるだけ避けてください。

于 2012-04-20T15:34:18.747 に答える
-1

まず、プロジェクトに継承ツリーを作成できます。このツリーでは、基本クラスが一連の異なるタイプ間で共有/共通のプロパティを保持します。

次に、クエリの匿名タイプから取得し、既知のタイプにマップした後、Jon Skeetのブログのように実際のタイプにマップすることができます。恐ろしい大げさなハック:匿名タイプのインスタンスを返す

つまり、どのタイプがどのタイプを返すかを知る必要があります(それを回避することはできません)が、これにより、例のように、コードに追加する必要のある部分の量を減らすことができます。

static class GrottyHacks
{
    internal static T Cast<T>(object target, T example) //CAST TO SPECIFIED TYPE
    {
        return (T) target;
    }
}

class CheesecakeFactory
{
    static object CreateCheesecake()
    {
        return new { Fruit="Strawberry", Topping="Chocolate" };
    }

    static void Main()
    {
        object weaklyTyped = CreateCheesecake(); //ANONYMOUS TYPE GENERATION
        var stronglyTyped = GrottyHacks.Cast(weaklyTyped,
            new { Fruit="", Topping="" }); //"MAPPING"

        Console.WriteLine("Cheesecake: {0} ({1})",
            stronglyTyped.Fruit, stronglyTyped.Topping);            
    }
}
于 2012-04-20T15:23:16.503 に答える