在我正在处理的网络项目中,我需要使用动态控件显示3个对象列表(Employee
,Owner
和TradeReference
)。这3个类扩展了类DataEntry
。我有3个独立的显示功能,如下所示:
protected void DisplayEmployees()
{
for (int i = 0; i < employees.Count; i++)
{
Employee emp = employees[i];
emp.DisplaySelf(i, EmployeeDisplayPanel);
}//end for
}//end CreateDynamicEmployeeContols()
protected void DisplayOwners()
{
for (int i = 0; i < owners.Count; i++)
{
Owner own = owners[i];
own.DisplaySelf(i, OwnerDisplayPanel);
}//end for
}//end CreateDynamicOwnerContols()
protected void DisplayTradeRefs()
{
for (int i = 0; i < tradeRefs.Count; i++)
{
TradeReference tRef = tradeRefs[i];
tRef.DisplaySelf(i, TradeRefDisplayPanel);
}//end for
}//end CreateDynamicTradeRefContols()
此解决方案包含代码重复,因此我创建了一个扩展DisplayableList
的通用类List
。 DisplayableList
包含对Panel
的引用,并且具有{get}方法,否则,它与List
相同。现在我的代码看起来像这样:
[Serializable]
public class DisplayableList<T> : List<T>
{
private Panel display;
public DisplayableList(ref Panel display)
{
this.display = display;
}//end constructor
public Panel Display
{
get
{
return this.display;
}//end get
}//end Display
}//end class
//on Web Page
{
...
protected void DisplayList(DisplayableList<DataEntry> list)
{
for (int i = 0; i < list.Count; i++)
{
DataEntry entry = list[i];
entry.DisplaySelf(i, list.Display);
}//end for
}//end DisplayList() ...ext... }//end Page
这应该可以,但我得到一个运行时错误,因为Panel没有序列化。如何序列化Web控件?如果那是不可能的,我怎样才能实现一个没有代码重复或破解封装的解决方案(可能是设计模式)?
我已经放弃了对一个面板进行序列化,因为我不得不在某些方面对它进行反序列化,这很麻烦。
我尝试使用返回面板的函数替换Panel
类中存储的DisplayableList
:
public class DisplayableList<T> : List<T>
{
private Func<Panel> getDisplay;
public DisplayableList(Func<Panel> func)
{
this.getDisplay = func;
}// end constuctor
public Panel Display
{
get
{
return getDisplay();
}//end get
}//end Display
}//end class
将存储的函数是一个简单的get方法:
public Panel GetEmployeeDisplayPanel()
{
return EmpDisplayPanel;
}
我仍然得到序列化异常。序列化一个函数(在内容页面上定义)比序列化Panel
更容易,我将如何去做?