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.

Foi útil?

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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top