动态变化类型的二进制去除对象

时间:2015-11-12 09:03:20

标签: c#

我有一个问题,我认为这是基本知识,但找不到任何信息来源来填补我的空白。

情况看起来像这样我正在使用每个对象的几个对象。敌人的例子:

foreach (var property in _foundBackupProjectFiles)
{
    DeserializeDocumentSetFromBinary(property.Key);
}

其中_foundBackupProjectFiles是Dictionary Key是对象值的名称是服务文件列表(名称+路径)。

现在每个对象都是一个不同的列表,现在我正在使用:

if (property == "Document")
{
    var deserilized = (List<DocumentSet.Document>) bformatter.Deserialize(stream);
    listdoc.AddRange(deserilized);
}
else if (property == "DocumentLookup")
{
    var deserilized = (List<DocumentSet.DocumentLookup>) bformatter.Deserialize(stream);
    listdoclookup.AddRange(deserilized);
}
else if (property == "DocumentText")
{
    var deserilized = (List<DocumentSet.DocumentText>) bformatter.Deserialize(stream);
    listdoctxt.AddRange(deserilized);
}

它有效,但它看起来很丑陋,难以阅读,是否有一种优雅的方式来委派这部分:

var deserilized = List<DocumentSet.DocumentText>)bformatter.Deserialize(stream);
listdoctxt.AddRange(deserilized);

并添加动态类型?

1 个答案:

答案 0 :(得分:1)

This is not a hell of a lot neater but you could use a switch with a extension method to add the deserialized object to the list.

public class Class
{
    private List<Document> listdoc = new List<Document>();
    private List<DocumentLookup> listdoclookup = new List<DocumentLookup>();
    private List<DocumentText> listdoctxt = new List<DocumentText>();

    public void Deserialize(string property, Stream stream)
    {
        var bformatter = new BinaryFormatter();
        var des = bformatter.Deserialize(stream);
        switch (property)
        {
            case "Document":
                listdoc.AddToList(des);
                break;

            case "DocumentLookup":
                listdoclookup.AddToList(des);
                break;

            case "DocumentText":
                listdoctxt.AddToList(des);
                break;

            default:
                throw new ArgumentOutOfRangeException("property");
        }
    }
}

public static class ListDeserializeExts
{
    public static void AddToList<TValue>(this List<TValue> list, object des)
    {
        list.AddRange((IEnumerable<TValue>)des);
    }
}