我们正在使用动态公开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");

...由于我没有明确施放枚举,因此编译器引发了错误。

有什么想法在将类型动态投入正确的枚举的同时,如何克服这个问题?

同样,我不能修改服务所示的实际对象,而只能修改服务的代码。

谢谢,乔治

有帮助吗?

解决方案

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 Web服务上也有类似的问题。我用来为您通过NAV公开的每个服务创建一个新的Web参考的解决方案,而不仅仅是所有服务的一个。这样可以防止您在不使用反射或黑客的情况下遇到的碰撞。

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

编辑:我的意思是, enum 与一个不一样 class. 。为一个 class, ,人们期望通过/接收一个实例。为 enum, ,它是其成员的一个或组合,以一种形式通过 int 价值。

EDIT2:您是否尝试使用 enum 作为某种 struct 这里?

EDIT3:您将必须查看哪种类型是 enum 在调试模式下,弄清楚如何反思。

object enumValueReturned = service.BusinessObjectEnumeration;

放在 enumValueReturned 在手表窗口中并使用反射播放它(GetMembers)看,你将如何达到 Item1.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top