¿Cómo puedo extraer una parte de un gráfico de objetos xaml a través de linq to xml?

StackOverflow https://stackoverflow.com/questions/45732

  •  09-06-2019
  •  | 
  •  

Pregunta

Tengo un gráfico de objetos serializado en xaml.Una muestra aproximada de cómo se ve es:

<MyObject xmlns.... >
    <MyObject.TheCollection>
        <PolymorphicObjectOne .../>
        <HiImPolymorphic ... />
    </MyObject.TheCollection>
</MyObject>

Quiero usar Linq to XML para extraer los objetos serializados dentro de TheCollection.

Nota: MyObject puede tener un nombre diferente en tiempo de ejecución;Estoy interesado en cualquier objeto que implemente la misma interfaz, que tenga una colección pública llamada TheCollection que contiene tipos de IPolymorphicLol.

Lo único que sé en tiempo de ejecución es la profundidad a la que encontraré la colección y que el elemento de la colección se llama ``*.TheCollection`.Todo lo demás cambiará.

El xml se recuperará de una base de datos usando Linq;Si pudiera combinar ambas consultas, en lugar de obtener el gráfico serializado completo y luego extraer los objetos de la colección, simplemente recuperaría la colección, eso sería excelente.

¿Fue útil?

Solución

Voluntad,

No es posible saber si un objeto implementa alguna interfaz mirando XAML.
Con las restricciones dadas, puede encontrar un elemento xml que tenga un hijo llamado .

Puede utilizar el siguiente código:Devolverá todos los elementos que tengan un elemento secundario cuyo nombre termine con .La colección

    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 asegurarse de que el objeto representado por este elemento implemente alguna interfaz, necesita leer metadatos de sus ensamblajes.Le recomendaría que utilice el marco Mono.Cecil para analizar tipos en sus ensamblajes sin utilizar la reflexión.

Otros consejos

@aku
Sí, sé que xaml no incluye ninguna indicación de tipos base o interfaces.Pero sí conozco la interfaz de los objetos raíz y la interfaz que contiene la colección en el momento de la compilación.

Los gráficos serializados se almacenan en una base de datos SQL como XML y estamos usando linq para recuperarlos como XElements.Actualmente, junto con su solución, estamos limitados a deserializar los gráficos, iterarlos, extraer los objetos que queremos de la colección, eliminar todas las referencias a ellos y luego desechar a sus padres.Es todo muy chapucero.Esperaba una solución de un solo trazo;algo parecido a un xpath, pero en línea con nuestra consulta de linq a sql que devuelve solo los elementos que estamos buscando...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top