题
我们正在使用动态公开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
.