سؤال

نحن نستخدم Microsoft ERP الذي يعرض خدمات الويب ديناميكيًا. الخدمات التي تم إنشاؤها بواسطة الخدمة خارج عن سيطرتنا. ليس لدينا رأي في كيفية إنشاء الكائنات ، بما في ذلك تعريفات النوع ، والتعرض لها. عند إضافة طريقة جديدة أو إزالتها من خدمة الويب ، يتم إعادة ترقيم جميع التعدادات النوعية ويتم إعادة ترقيم كل ما يستخدم خدمة الويب ، بعد التحديث إلى التعاريف الجديدة. في الأساس ،

enumeration Type1
  Item1
  Item2
  Item3

... يمكن أن تصبح

enumeration Type6
  Item1
  Item2
  Item3

... مع تغيير اسم نوع التعداد ، ولكن أعضاء النوع الثابت. تقوم الخدمة بإخراج خدمة تشبه النتيجة النهائية لاستخدام XSD.exe لإنشاء كائنات. لذلك في أي وقت يعرض شخص ما طريقة جديدة في الخدمة (عبر واجهة المستخدم الرسومية ERP) ، يتم إعادة بناء الكائنات ، ويتم تعيين الأنواع لتعريفات الخدمة بالترتيب الأبجدي ، وإعادة التعبير ، وترك لقطة قاعدة الكود بأكملها.

حاولت استخدام التفكير لتحديد النوع ثم تحليل العضو الثابت في كائن العمل الجديد ، لكن هذا لا يعمل لأنني لا أستطيع الكتابة اللطيفة دون معرفة الاسم الفعلي للنوع. ما يلي لن يعمل.

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

... بينما يرمي المترجم خطأً لأنني لا ألقي التعداد بشكل صريح.

أي أفكار كيف يمكنني التغلب على هذه المشكلة مع إلقاء النوع ديناميكيًا على التعداد الصحيح؟

مرة أخرى ، لا يمكنني تعديل الكائنات الفعلية المكشوفة من قبل الخدمة ، فقط الرمز المشترك في الخدمة.

شكرا يا جورج

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

المحلول

إعادة رمز المثال:

System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");

ربما تكون طريقة القيام بذلك هي عن طريق التأمل:

var prop = service.GetType().GetProperty("SomeField");
prop.SetValue(service, Enum.Parse(prop.PropertyType, "Item1"), null);

نصائح أخرى

واجهت مشكلة مماثلة مع NAV Web Services. الحل الذي اعتدت على إنشاء مرجع ويب جديد لكل خدمة تعرضها من خلال NAV بدلاً من مجرد حل واحد لجميع الخدمات. هذا يمنع تصادم الاسم الذي تواجهه دون استخدام التفكير أو الاختراقات.

لماذا يجب أن تحتاج إلى تحليل الأشياء؟
إذا فهمت التعدادات بشكل صحيح ، فإنها تمرر القيمة (وليس التعداد نفسه).

تحرير: ما أعنيه هو ، enum ليس نفس أ class. ل class, ، يتوقع المرء تمرير/استلام مثيل. ل enum, ، هو واحد أو مزيج من أعضائها ، الذي يتم تمريره في شكل int القيمة.

EDIT2: هل تحاول استخدام enum كنوع من struct هنا؟

EDIT3: سيكون عليك معرفة نوع هو enum في وضع التصحيح ، لمعرفة كيفية التفكير فيه.

object enumValueReturned = service.BusinessObjectEnumeration;

ضع ال enumValueReturned في Watch Window والعب معها باستخدام الانعكاس (GetMembers) لترى ، كيف ستصل Item1.

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