如何序列化Web控件? [编辑]如何序列化一个函数?

时间:2016-08-29 18:51:19

标签: c# asp.net

在我正在处理的网络项目中,我需要使用动态控件显示3个对象列表(EmployeeOwnerTradeReference)。这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的通用类ListDisplayableList包含对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更容易,我将如何去做?

1 个答案:

答案 0 :(得分:0)

您必须使用[Serializable]属性。 Herehere您有一些关于如何使用它的深入文档和教程