2010-06-21 102 views
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"); 

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

任何想法如何在动态地将类型转换为正确的枚举时解决此问题?

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

感谢, 乔治

回答

7

重新示例代码:

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); 
+0

我想,使用反射来检索值和设置属性是唯一可用的方式,给定OP约束。 当然这意味着即使使用这样的枚举作为参数的方法也应该使用反射来调用(因为它是不可知的调用参数类型)... – BladeWise 2010-07-05 07:16:36

0

为什么你需要分析的东西?
如果我正确理解Enums,它们传递值(而不是Enum本身)。

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

编辑2:你是否试图在这里使用enum作为某种struct?编辑3:你将不得不在调试模式下看到enum是什么类型,以弄清楚如何反思它。

object enumValueReturned = service.BusinessObjectEnumeration; 

enumValueReturned在监视窗口&发挥它使用反射(GetMembers)看看,你会怎么达到Item1

+0

-1您可能需要枚举的名称或字符串值的原因很多也许某些XML序列化保存了字符串值,也许它们用于填充下拉列表等,如果在中间添加新值,您想要挂在枚举的名称上。所有这些用途可能不是最聪明的做法,但它们仍然是实践。 – SWeko 2010-06-21 14:52:23

+0

@Sweko:如何从webservice传递的枚举值?它是否与实际值一起传递枚举的整个元数据?我的意思是,当你寻找一个成员值时,Enum的意义何在? – shahkalpesh 2010-06-21 15:05:59

+0

当Web服务被引用时,在客户端上生成Enum元数据,然后在运行时在请求/响应调用中使用该元数据。我同意,int对于web服务的使用来说更便于携带,但OP不能控制服务。 – SWeko 2010-06-21 16:11:14

1

我曾与导航Web服务类似的问题。我用来为通过Nav公开的每个服务创建新Web引用的解决方案,而不仅仅是针对所有服务的一个服务。这样可以避免您在使用反射或黑客时遇到的名称冲突。