列出2种不同的对象类型

时间:2012-09-17 13:18:30

标签: c# .net interface

我有2个实体,'Deal'和'Store'。我想将它们组合在一个列表中,以及一个整数或其他表示类型的东西。

我已经做了一些谷歌搜索,并提出了一个解决方案,但由于这一切都非常新颖和令人困惑,我不确定它是否是最好的解决方案。

我已经使用了一个接口来执行此操作 - 下面的代码,我很欣赏这是否是正确合理的方法。

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));

3 个答案:

答案 0 :(得分:2)

您是否考虑过使用C#Struct

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

DBM.add(new DealBookmarker)

如果需要,您还可以向Struct添加构造函数

与ref类型不同的类结构是值类型,它允许您创建像内置数据类型一样的对象,因为它是在堆栈而不是堆上启动的,它将产生性能提升。

在这种情况下对类使用struct的好处:

  1. 更好的表现
  2. 通过值而非参考
  3. 传递
  4. 可以有一个构造函数(必须参数化)
  5. 仍然可以实现接口
  6. 和我最喜欢的ITS SIMPLER !!!

答案 1 :(得分:1)

您可以实施Factory method(GOF模式)

链接:http://www.dofactory.com/Patterns/PatternFactory.aspx

Nota:

'优惠'和'商店'是您的Concrete Product

IBookmarkWrapper是您的Product

并定义Creator

答案 2 :(得分:1)

如果您打算在转发器中使用它(我希望您实际上是指ListView),那么只需在界面中定义您的属性,然后在Deal和Store类中实现该接口。然后,您可以将List绑定到repeater / listview并按名称调用属性。不需要任何诡计。通过这样做,接口保证您的属性可用(否则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)可以作为属性添加到您的类中。只需确保在界面中定义它们并使用一致的命名。通过这样做,您可以在维护类结构的同时填充两种不同类型的列表。如果您需要稍后从列表中选择它们,您可以像这样抛出:

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

或者其他几种方式,取决于您要完成的任务。