3

我们正在使用动态公开 Web 服务的 Microsoft ERP。服务产生的服务是我们无法控制的。对于如何创建和公开对象(包括类型定义),我们没有发言权。当从 Web 服务中添加或删除新方法时,所有类型枚举都会重新编号,并且在更新到新定义后,使用 Web 服务的所有内容都会被清除。所以本质上,

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");

...因为编译器抛出错误,因为我没有明确地转换枚举。

有什么想法可以在将类型动态转换为正确的枚举时克服这个问题吗?

同样,我不能修改服务公开的实际对象,只能修改订阅服务的代码。

4

3 回答 3

8

重新示例代码:

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);
于 2010-07-04T07:43:18.630 回答
1

我对 Nav Web 服务也有类似的问题。我过去常常为通过 Nav 公开的每个服务创建一个新的 Web 引用的解决方案,而不是为所有服务创建一个单独的引用。这可以防止您在不使用反射或黑客攻击的情况下遇到名称冲突。

于 2011-03-02T21:40:33.477 回答
0

为什么需要解析事物?
如果我正确理解枚举,它们会传递值(而不是枚举本身)。

编辑:我的意思是,enumclass. 对于 a class,人们期望一个实例被传递/接收。对于 an enum,它是其成员之一或组合,以int值的形式传递。

EDIT2:你想在这里使用enum某种形式struct吗?

EDIT3:您将不得不查看enum调试模式下的类型,以确定如何反映它。

object enumValueReturned = service.BusinessObjectEnumeration;

放入enumValueReturned观察窗口并使用反射( )玩它GetMembers,看看你会如何到达Item1

于 2010-06-21T14:43:25.397 回答