Вопрос

Мы используем 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top