كيف يمكنني استخراج جزء من الرسم البياني لكائن xaml عبر linq إلى xml؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

لدي رسم بياني كائن متسلسل إلى xaml.عينة تقريبية لما تبدو عليه هي:

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

أريد استخدام Linq to XML لاستخراج الكائنات المتسلسلة داخل TheCollection.

ملحوظة: MyObject قد يتم تسميتها بشكل مختلف في وقت التشغيل؛أنا مهتم بأي كائن ينفذ نفس الواجهة، والذي يحتوي على مجموعة عامة تسمى TheCollection الذي يحتوي على أنواع IPolymorphicLol.

الشيء الوحيد الذي أعرفه في وقت التشغيل هو العمق الذي سأجد فيه المجموعة وأن عنصر المجموعة يسمى ``*.TheCollection`.كل شيء آخر سوف يتغير.

سيتم استرداد ملف XML من قاعدة البيانات باستخدام Linq؛إذا كان بإمكاني الجمع بين كلا الاستعلامين، فبدلاً من الحصول على الرسم البياني المتسلسل بالكامل ثم استخراج كائنات المجموعة، سأستعيد المجموعة التي ستكون رائعة.

هل كانت مفيدة؟

المحلول

سوف،

ليس من الممكن معرفة ما إذا كان الكائن يطبق بعض الواجهات من خلال النظر إلى XAML.
مع القيود المعطاة، يمكنك العثور على عنصر XML يحتوي على فرع اسمه .

يمكنك استخدام الكود التالي:سيُرجع جميع العناصر التي تحتوي على عنصر فرعي ينتهي به الاسم .المجموعة

    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;
            }
        }
    }

للتأكد من أن الكائن الذي يمثله هذا العنصر ينفذ بعض الواجهات، تحتاج إلى قراءة البيانات الوصفية من التجميعات الخاصة بك.أنصحك باستخدام إطار عمل Mono.Cecil لتحليل الأنواع في تجميعاتك دون استخدام الانعكاس.

نصائح أخرى

@أكو
نعم، أعلم أن xaml لا يتضمن أي إشارة إلى الأنواع الأساسية أو الواجهات.لكنني أعرف واجهة الكائنات الجذرية والواجهة التي تحتوي عليها المجموعة في وقت الترجمة.

يتم تخزين الرسوم البيانية المتسلسلة في قاعدة بيانات SQL بتنسيق XML، ونحن نستخدم linq لاستردادها كعناصر XElements.في الوقت الحالي، إلى جانب الحل الذي تقدمه، يقتصر عملنا على إلغاء تسلسل الرسوم البيانية، والتكرار من خلالها، وسحب الكائنات التي نريدها من المجموعة، وإزالة كافة الإشارات إليها من أصولها، ثم التخلص منها.كل شيء kludgy جدا.كنت أتمنى التوصل إلى حل بضربة واحدة؛شيء على غرار xpath، ولكن يتماشى مع استعلام linq إلى sql الذي يُرجع العناصر التي نبحث عنها فقط...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top