我们正在使用动态公开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");
...因为编译器抛出错误,因为我没有明确地输出枚举。
如何在将类型动态转换为正确的枚举时如何克服此问题?
同样,我无法修改服务公开的实际对象,只能修改订阅服务的代码。
谢谢, 乔治
答案 0 :(得分: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);
答案 1 :(得分:1)
Nav Web服务遇到了类似的问题。我曾经使用的解决方案为您通过Nav公开的每个服务创建一个新的Web引用,而不是仅为所有服务提供一个服务。这可以防止您遇到的名称冲突而不使用反射或黑客攻击。
答案 2 :(得分:0)
你为什么需要解析东西?
如果我正确理解Enums,它们会传递值(而不是Enum本身)。
编辑:我的意思是,enum
与class
不同。对于class
,需要传递/接收实例。对于enum
,它是一个成员或其成员的组合,以int
值的形式传递。
EDIT2:您是否尝试将enum
用作某种struct
?
EDIT3:您必须在调试模式下查看enum
的类型,以了解如何反映它。
object enumValueReturned = service.BusinessObjectEnumeration;
将enumValueReturned
放入观看窗口&使用反射(GetMembers
)来玩,看看,你将如何到达Item1
。