代码之家  ›  专栏  ›  技术社区  ›  George Johnston

解析动态枚举

  •  3
  • George Johnston  · 技术社区  · 16 年前

    我们使用的是动态公开web服务的microsofterp。服务生成的服务超出了我们的控制范围。对于对象(包括类型定义)是如何创建和公开的,我们没有发言权。当从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 回复  |  直到 7 年前
        1
  •  8
  •   BenMorel Manish Pradhan    12 年前

    重新输入示例代码:

    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);
    
        2
  •  1
  •   Corey    15 年前

        3
  •  0
  •   shahkalpesh    16 年前


    如果我正确地理解了枚举,它们将传递值(而不是枚举本身)。

    enum 不等于 class . 为了一个 ,则期望传递/接收实例。对于一个 枚举 int 价值观。

    EDIT2:你想用 作为某种 struct

    EDIT3:你得看看这是什么类型的 在调试模式下,找出如何反映它。

    object enumValueReturned = service.BusinessObjectEnumeration;
    

    把钥匙放好 enumValueReturned GetMembers )看看,你会怎样到达 Item1 .

    推荐文章