如何序列化的委托(How to serialize a delegate)

2019-09-16 16:27发布

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

我们有类。 它有一个委托FormatCell,这需要一些数据 ,并将其转换为字符串FormatCell委托是在设计时未知的-它可能是由插件设置。

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委托?

PS我知道这个问题,但我的问题是具体得多的情况。 也许一个人在这种情况下特定的可靠运行的解决方案?

Answer 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是位于某处的插件组装。



文章来源: How to serialize a delegate