【问题标题】:How to serialize a delegate如何序列化委托
【发布时间】:2012-04-22 11:04:11
【问题描述】:

让我们看一个网格填充的例子。

我们有 Column 类。它有一个委托 FormatCell,它接受一些 Data 并将其转换为 stringFormatCell 委托在设计时是未知的 - 它可能由插件设置。

public class ColumnFormatter
{
    public Func<Data, string> FormatCell {get; set;}
    //...
}

以下是如何使用此类列的示例。

public class Table
{
    public List<Column> Columns;

    public List<List<string>> BuildTable(List<Data> dataRows)
    {
        var table = new List<List<string>>();

        foreach (var data in dataRows)
        {
            var line = new List<string>();                    
            foreach (var column in Columns)
            {
                line.Add(column.FormatCell(data));
            }

            table.Add(line);
        }

        return table;
    }
}

现在每一列都应该保存它的状态。问题是如何序列化这个 FormatCell 委托?

附:我知道this question,但我的问题更具体。对于这种情况,也许有人有一个特定的可靠的磨合解决方案?

【问题讨论】:

  • 支持,委托对象是二进制序列化的。完全不清楚您为什么会遇到问题,或者您想要使用哪种序列化,或者您为什么需要它,或者您是否尝试过让它工作。

标签: c# serialization delegates


【解决方案1】:

为什么不直接使用继承?并且不要尝试序列化委托。像这样的:

[Serializable]
public abstract class ColumnFormatterBase
{
    public abstract string FormatCell(Data data);
}

[Serializable]
public class ColumnFormatter1: ColumnFormatterBase
{
    object SerializableProperty1 {get; set;}
    object SerializableProperty2 {get; set;}
    public override string FormatCell(Data data)
    {
        return // formatted result //;
    }
}

它可以被序列化,即使 ColumnFormatterBase 的实现位于插件程序集中的某个地方。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2010-09-24
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多