تحليل التعداد الديناميكي
سؤال
نحن نستخدم 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
.