私が取り組んでいるWebプロジェクトでは、ダイナミックコントロールを使用して3つのオブジェクトリスト(Employee
、Owner
、およびTradeReference
)を表示する必要があります。これらの3つのクラスはクラスDataEntry
を拡張します。どのようにWebコントロールをシリアル化しますか?どのように私は関数をシリアル化するのですか?
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()
このソリューションは、コードの重複を持っているので、私はList
を拡張ジェネリッククラスDisplayableList
を作成しました:私はこのようになり、3つの別々の表示機能を持っています。 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コントロールをシリアル化するにはどうすればよいですか?それが不可能な場合は、コードの重複やカプセル化を破らないソリューション(実装パターン)を実装するにはどうすればよいですか?私は多くの問題への道であるかの時点でそれをデシリアライズする必要がありますするつもりですので、
編集
はIは、パネルをシリアル化をあきらめました。
私はパネルを返す関数で、私のDisplayableList
クラスで保存されたPanel
を交換してみました:
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
をシリアライズするより簡単に(コンテンツページで定義されている)関数をシリアライズしていますが、どうすればそれをやり遂げることができますか?