解析动态枚举

时间:2010-06-21 13:56:35

标签: c# casting navision nav

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

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

如何在将类型动态转换为正确的枚举时如何克服此问题?

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

谢谢, 乔治

3 个答案:

答案 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本身)。

编辑:我的意思是,enumclass不同。对于class,需要传递/接收实例。对于enum,它是一个成员或其成员的组合,以int值的形式传递。

EDIT2:您是否尝试将enum用作某种struct

EDIT3:您必须在调试模式下查看enum的类型,以了解如何反映它。

object enumValueReturned = service.BusinessObjectEnumeration;

enumValueReturned放入观看窗口&使用反射(GetMembers)来玩,看看,你将如何到达Item1