1

「ディール」と「ストア」の 2 つのエンティティがあります。これらを 1 つのリストに結合し、整数または型を示すその他のものと一緒に使用したいと考えています。

私は少しグーグルで解決策を考え出しましたが、それはすべてかなり新しく混乱しているため、それが最善の解決策であるかどうかはわかりません.

これを行うためにインターフェイスを使用しました-以下のコード、これが正しく合理的なアプローチであるかどうかについてアドバイスをいただければ幸いです。

public interface IBookmarkWrapper
{
    int DataType { get; private set; }
    object Data { get; private set; }
}

public class DealBookmarkWrapper : IBookmarkWrapper
{
    public int DataType { get; private set; }
    public object Data { get; private set; }

    public DealBookmarkWrapper(Deal deal)
    {
        deal.ThrowNull("deal");

        DataType = 1;
        Data = deal;
    }
}

そして使用中:

    var list = new List<IBookmarkWrapper>();
    list.Add(new DealBookmarkWrapper(deal));
4

3 に答える 3

2

C# Structの使用を考えたことがありますか?

struct DealBookmarker
    {
        public Deal Dl;
        public Store St;
        public int Type;
    }
List<DealBookmarker> DBM = new List<DealBookmarker>();

DBM.add(new DealBookmarker)

必要に応じて、構造体にコンストラクターを追加することもできます

参照型であるクラスとは異なり、構造体は値型であり、組み込みデータ型のように機能するオブジェクトを作成できます。これは、ヒープではなくスタックで開始されるため、パフォーマンスが向上します。

この場合、クラスに対して構造体を使用する利点:

  1. よりよい性能
  2. 参照ではなく値渡し
  3. コンストラクターを持つことができます (パラメーター化する必要があります)
  4. まだインターフェースを実装できます
  5. そして私のお気に入りのITS SIMPLER!!!
于 2012-09-17T20:10:42.870 に答える
1

実装できるFactory method(GOFのパターン)

リンク : http://www.dofactory.com/Patterns/PatternFactory.aspx

注 :

「ディール」と「ストア」はあなたのConcrete Product

IBookmarkWrapper はあなたのProduct

そして定義するCreator

于 2012-09-17T13:38:38.040 に答える
1

リピーターで使用する場合 (実際には ListView のことを意味しているといいのですが)、インターフェイスでプロパティを定義してから、Deal クラスと Store クラスでインターフェイスを実装します。次に、リストをリピーター/リストビューにバインドし、プロパティを名前で呼び出すことができます。トリックは必要ありません。これにより、インターフェイスはプロパティが使用可能であることを保証します (そうしないと、バインディング中に DataTextvalue が壊れます)。

つまり、ListView にバインドする場合は、Store クラスと Deal クラスの両方で表示プロパティに同じ名前を付ける必要があります。したがって、インターフェイスを最も基本的な形式で使用することもできます。

protected Page_Load(object sender, EventArgs e)
{
    var list = new List<IWatchamacallit>();
    list.Add(new Store { Property1 = "Store1", Property2 = "StoreInfo"});
    list.Add(new Store { Property1 = "Store2", Property2 = "StoreInfo" });
    list.Add(new Deal { Property1 = "Deal1", Property2 = "DealInfo" });
    list.Add(new Deal { Property1 = "Deal2", Property2 = "DealInfo" });

    myListView.DataSource = list;
    myListView.DataBind();

    /*  from here just set your page controls to call the properties
        for instance:
            <asp:Label Text='<%# Eval("Property1") %>' />
            <asp:Label text='<%# Eval("Property2") %>' />   
    */
}

public interface IWatchamacallit
{
    string Property1 { get; set; }
    string Property2 { get; set; }
}

public class Store : IWatchamacallit
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

public class Deal : IWatchamacallit
{
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

入力は次のようにバインドされます。

Property1   Property1
=====================
Deal1       DealInfo
Deal2       DealInfo
Store1      StoreInfo
Store2      StoreInfo

保持する必要があるその他の値 (dealId や storeId など) は、プロパティとしてクラスに追加できます。インターフェイスでそれらを定義し、一貫した名前を使用していることを確認してください。これにより、クラス構造を維持しながら、2 つの異なる型でリストを埋めることができます。後でリストからそれらを選択する必要がある場合は、次のようにキャストできます。

foreach (var item in list)
{
    var tempContainer = Activator.CreateInstance(item.GetType());
    tempContainer = item;
}

または、達成しようとしていることに応じて、他のいくつかの方法のいずれかです。

于 2012-09-17T21:59:49.133 に答える