Разбор динамического перечисления
Вопрос
Мы используем Microsoft ERP, которая динамически обнажает веб-сервисы. Услуги, созданные сервисом, выходит из нашего контроля. Мы не говорим так, как объекты, включая определения типа, создаются и разоблачены. Когда новый метод добавлен или удален из веб-сервиса, все перечисления типа перенумевают и все, что использует веб-сервис, после обновления на новые определения, включается. Так по сути,
enumeration Type1
Item1
Item2
Item3
... мог стать
enumeration Type6
Item1
Item2
Item3
... с изменением имени типа перечисления, но члены типа оставшихся статическими. Сервис выводит услугу, которая выглядит точно так же, как конечный результат использования XSD.exe для генерации объектов. Таким образом, в любое время кто-то выставляет новый метод на службе (через ERP GUI), объекты перестраиваются, типы назначаются определениям обслуживания в алфавитном порядке, повторяется, оставляя весь код кода.
Я попытался использовать отражение, чтобы определить тип, а затем изменить статический элемент в новый бизнес-объект, но он не работает, потому что я не могу ввести отбрасывать перечисление, не зная фактического имени типа. Ниже не будет работать.
System.Type t = service.BusinessObjectEnumeration.GetType();
service.SomeField = Enum.Parse(t,"Item1");
... Как компилятор бросает ошибку, потому что я не явно отличающую перечисление.
Любые идеи, как я могу преодолеть этот вопрос, одновременно динамически отличающий тип к правильному перечислению?
Опять же, я не могу изменить фактические объекты, выставленные сервисом, только код подписывается на службу.
Спасибо, Джордж
Решение
Re Например, код:
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, а не просто один для всех услуг. Это предотвращает поименные столкновения, которые вы испытываете без использования отражения или взлома.
Почему вам нужно, чтобы вам нужно проанализировать вещи?
Если я правильно понимаю, они передают значение (а не сам по себе).
Редактировать: что я имею в виду, enum
не такой же как class
. Отказ Для class
, Ожидается, что необходимо пропустить / получено. Для enum
, это одно или сочетание его членов, которые передаются в форме int
ценность.
Редактировать2: вы пытаетесь использовать enum
как какой-то struct
здесь?
Редактировать3: вам нужно будет посмотреть, какой тип enum
В режиме отладки, чтобы выяснить, как на нем размышлять.
object enumValueReturned = service.BusinessObjectEnumeration;
Поставить enumValueReturned
в часовом окне и играйте с ним с помощью отражения (GetMembers
) видеть, как бы вы достигли Item1
.