Из-за бизнес-решений, которые выше моей зарплаты, мне нужно разобрать и объединить несколько XML-файлов.
Чтобы сократить избыточный код, у меня есть эта карта:
private static readonly Dictionary<string, Type> listTypeByFileName = new Dictionary<string, Type> {
{"a.xml", typeof(List<A>)},
{"b.xml", typeof(List<B>)},
{"c.xml", typeof(List<C>)},
{"d.xml", typeof(List<D>)},
// etc.
};
Поскольку эта карта используется после загрузки и анализа всех XML-файлов, результат имеет тип Dictionary<string, object>
, где key
совпадает с ключами на приведенной выше карте, а value
имеет тип, указанный в карте, в результате выполнения этот код с DownloadFiles (config):
private static Dictionary<string, object> DownloadFiles(IConfigurationRoot config) {
Dictionary<string, object> dataListByFileNames = new Dictionary<string, object>();
listTypeByFileName.Keys.ToList()
.ForEach(name => dataListByFileNames.Add(name, DownloadData(name, config)));
return dataListByFileNames;
}
private static object DownloadData(string name, IConfigurationRoot config) {
_ = listTypeByFileName.TryGetValue(name, out Type listType);
return new XmlSerializer(listType, new XmlRootAttribute("Document"))
.Deserialize(new StringReader(DownloadFromBlobStorage(name, config).ToString()));
}
private static CloudBlockBlob DownloadFromBlobStorage(string filetoDownload, IConfigurationRoot config) {
return CloudStorageAccount.Parse(config["AzureWebJobsStorage"])
.CreateCloudBlobClient()
.GetContainerReference(config["BlobStorageContainerName"])
.GetBlockBlobReference(filetoDownload);
Первый вопрос: есть ли способ сделать возврат более безопасным? Возможно, используя параметризованные типы?
Вторая часть проблемы фактически потребляет этот Dictionary
.
Для каждого типа в этом Dictionary
теперь мне нужна функция вроде:
private void AddA(Dictionary<string, object> dataByFileNames) {
if (dataByFileNames.TryGetValue("a.xml", out object data)) {
List<A> aList = (List<A>)data;
aList.ForEach(a =>
doSomethingWithA(a);
);
}
}
private void AddB(Dictionary<string, object> dataByFileNames) {
if (dataByFileNames.TryGetValue("b.xml", out object data)) {
List<B> bList = (List<B>)data;
bList.ForEach(b =>
doSomethingWithB(b);
);
}
}
// etc.
Поскольку у меня уже есть список имен файлов для типов (верхняя часть этого вопроса), я чувствую, что должен быть какой-то способ абстрагировать вышеизложенное, чтобы его не нужно было повторять снова и снова и снова. Обратите внимание: может быть важно, что каждый тип (A, B, C, D и т. д.) имеет свойство string Id
, которое определенно понадобится для всех doStringWithX()
методов... если это полезно, я могу создать интерфейс для этого. Ничего страшного, если мне нужно привести к правильному типу в каждом doStringWithX()
или при вызове каждого из этих методов.c