سؤال

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

namespace TestApplication
{  
    public class Giraffe : Mammal
    {
        public Giraffe()
        {
        }
    }
}

عند أسميه WebMethod التي نتوقع كائن من نوع الثدييات، وأحصل على استثناء التالي تقول لي أن الزرافة ليس من المتوقع.

  Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
   --- End of inner exception stack trace ---

هل هناك حل بديل ذلك؟ لا أستطيع أن أضيف حقا XmlInclude ...

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

المحلول

لإضافة أساليب، يجب أن تكون باستخدام فئات جزئية. حاول إضافة ملف من الدرجة الثانية مع (في مساحة الاسم الصحيح الخ):

partial class Mammal {
    public void ExtraMethod() {...}
}

والكلمة partial يحكي مترجم للسماح للفئة ليتم تقسيم على ملفات متعددة - مثالية لسيناريوهات رمز جيل. لا، ومع ذلك، تطالبها الكلمة partial في كل ملف. أعضاء ببساطة مجتمعة (باستثناء طرق جزئية في C # 3.0 التي لها سلوك خفية خاصة بهم). I <م> أمل أن wsdl.exe (أو أيا كان) ويشمل هذا!

نصائح أخرى

إذا كنت ترغب فقط في إضافة أساليب إلى درجة التي لا يمكن أن تتغير، فقط إنشاء طرق الإرشاد.

public static class MammalExt {
public static void ExtraMethod(this Mammal mammal) {...}}

وعلى الرغم من الثدييات إذا هي الفئة التي تم إنشاؤها الوكيل يجب أن يكون فئة جزئية.

ولديك لاستخدام XmlInclude. انها الخيار الوحيد. عليك أن تخبر مسلسل ما درجة التي سوف تسلسل، لأنه لتوليد رمز للقيام التسلسل.

ووضرب لي فقط أثناء كتابة هذا، التي قد تفلت من العقاب مع وجود الزرافة تنفيذ IXmlSerializable، ولكن هذا المزيد من العمل.

والجواب الصحيح هو في الواقع استخدام فئة جزئية. عند فتح المشروع العميل وتوليد مرجع ويب أو Visual Studio يوزع WSDL ويولد فئة تسمى Mammal بالنسبة لك. هذه الفئة لا تظهر إلا المشروع العميل، لذلك لم يكن لديك ما يدعو للقلق على الخادم الجانب من الأمور.

ويقول لديك مرجع ويب يسمى MyWebService. ثم سيكون هناك فئة تسمى MyWebService.Mammal. لإضافة أعضاء إلى هذه الفئة، كل ما عليك القيام به هو إنشاء ملف مصدر جديد يحتوي هذا:

namespace MyWebService {
    public partial class Mammal {
        public void ExtraMethod() { ... }
    }
}

عند استدعاء أسلوب على خدمة الويب الخاص بك وترجع Mammal، ورمز مرجع ويب إنشاء مثيل جديد من برنامج "تحسين" الطبقة الثدييات، ونسخ القيم من أكس على السلك إلى المثيل.

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