Como posso extrair uma parte de um gráfico de objeto xaml via linq para xml?
-
09-06-2019 - |
Pergunta
Eu tenho um gráfico de objeto serializado em xaml.Uma amostra aproximada de sua aparência é:
<MyObject xmlns.... >
<MyObject.TheCollection>
<PolymorphicObjectOne .../>
<HiImPolymorphic ... />
</MyObject.TheCollection>
</MyObject>
Quero usar Linq to XML para extrair os objetos serializados dentro do TheCollection.
Observação: MyObject
pode ter nomes diferentes em tempo de execução;Estou interessado em qualquer objeto que implemente a mesma interface, que possua uma coleção pública chamada TheCollection
que contém tipos de IPolymorphicLol
.
As únicas coisas que sei em tempo de execução são a profundidade em que encontrarei a coleção e que o elemento da coleção se chama ``*.TheCollection`.Todo o resto mudará.
O xml será recuperado de um banco de dados utilizando Linq;se eu pudesse combinar as duas consultas, em vez de obter o gráfico serializado inteiro e extrair os objetos da coleção, eu apenas recuperaria a coleção que seria ótima.
Solução
Vai,
Não é possível descobrir se um objeto implementa alguma interface observando o XAML.
Com as restrições fornecidas, você pode encontrar o elemento xml que possui um filho chamado.
Você pode usar o seguinte código:Ele retornará todos os elementos com elemento filho cujo nome termina com .A coleção
static IEnumerable<XElement> FindElement(XElement root)
{
foreach (var element in root.Elements())
{
if (element.Name.LocalName.EndsWith(".TheCollection"))
{
yield return element.Parent;
}
foreach (var subElement in FindElement(element))
{
yield return subElement;
}
}
}
Para garantir que o objeto representado por este elemento implemente alguma interface, você precisa ler os metadados de seus assemblies.Eu recomendo que você use o framework Mono.Cecil para analisar tipos em suas montagens sem usar reflexão.
Outras dicas
@aku
Sim, eu sei que o xaml não inclui nenhuma indicação de tipos básicos ou interfaces.Mas eu conheço a interface dos objetos raiz e a interface que a coleção contém em tempo de compilação.
Os gráficos serializados são armazenados em um banco de dados SQL como XML e estamos usando o linq para recuperá-los como XElements.Atualmente, junto com sua solução, estamos limitados a desserializar os gráficos, iterá-los, retirar os objetos que queremos da coleção, remover todas as referências a eles e, em seguida, descartar seus pais.É tudo muito desajeitado.Eu esperava uma solução única;algo parecido com um xpath, mas alinhado com nossa consulta linq to sql que retorna apenas os elementos que procuramos ...