我有一个问题,我认为这是基本知识,但找不到任何信息来源来填补我的空白。
情况看起来像这样我正在使用每个对象的几个对象。敌人的例子:
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);
并添加动态类型?
答案 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);
}
}