我有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));
答案 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 :(得分: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;
}
或者其他几种方式,取决于您要完成的任务。