Разбор динамического перечисления - PullRequest
3 голосов
/ 21 июня 2010

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

..., поскольку компилятор выдает ошибку, потому что я не приводил явное приведение перечисления.

Есть идеи, как мне преодолеть эту проблему при динамическом приведении типа к правильному перечислению?

Опять же, я не могу изменить фактические объекты, предоставляемые службой, только код, подписывающийся на службу.

Спасибо, Джордж

Ответы [ 3 ]

8 голосов
/ 04 июля 2010

Пример кода:

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);
1 голос
/ 03 марта 2011

У меня была похожая проблема с веб-сервисами Nav. Решение, которое я использовал для создания новой веб-ссылки для каждого сервиса, который вы предоставляете через Nav, а не просто для всех сервисов. Это предотвращает конфликты имен, которые вы испытываете, без использования отражения или взломов.

0 голосов
/ 21 июня 2010

Зачем вам нужно разбирать вещи?
Если я правильно понимаю Enums, они передают значение (а не сам Enum).

РЕДАКТИРОВАТЬ: Я имею в виду, enum не то же самое, что class. Для class ожидается, что экземпляр будет передан / получен. Для enum это один или несколько его членов, которые передаются в виде значения int.

EDIT2: Вы пытаетесь использовать enum в качестве какого-то struct здесь?

РЕДАКТИРОВАТЬ3: Вы должны увидеть, какой тип enum в режиме отладки, чтобы выяснить, как отразить на нем.

object enumValueReturned = service.BusinessObjectEnumeration;

Вставьте enumValueReturned в окно часов и поиграйте с ним, используя отражение (GetMembers), чтобы увидеть, как бы вы достигли Item1.

...