我在寻找处理 WPF 和 WCF 上的枚举字段的通用解决方案时遇到问题,我需要一点帮助。让我们用一个例子来解释:
当创建一个具有 Sex 枚举值 [Male, Female] 的人时,我看到三种可能性:
默认为男性 -> 有两种可能性,但一种是默认。绑定(bind) ComboBox.SelectedValue 没有问题,WCF 序列化也没有问题,只要没有女性感到被冒犯:)
((Sex)(3)) Undefined value is default -> 有两种可能性,但开始用户被迫选择一种。 ComboBox.SelectedValue 正确设置 SelectedIndex = -1,但 WCF 抛出: 枚举值“3”对于类型“Sex”无效,无法序列化。如果类型具有 DataContractAttribute 属性,请确保存在必要的枚举值并用 EnumMemberAttribute 属性标记。
Sex 属性可以为空 -> 设置 Sex 是可选的,您甚至可以在选择一个后取消设置。
不幸的是,情况 2 是最常见的情况,但我们没有找到一种简单的方法来处理它,而无需像这样进行黑客攻击:
- 为 Sex 定义“Unknown”值,此值对实体无效,我会考虑它是否不是最常见的情况。
- 将枚举标记为 [Flags],以便 WCF 可以将“Male,Female”编码为未知。
- 用 [ComboHintUnkwnownOnNew] 之类的东西装饰性属性。
- 设置 SelectedIndex=-1,同时保持绑定(bind)在 WPF 中的某种方式。
我知道这是一个思想设计决策,而不是具体问题,但我希望得到一些帮助。
最佳答案
如何只为 View 定义客户端枚举(-1 表示未定义),然后根据所选的性别创建适当的 WCF 代理枚举,然后将其发送到服务。所以不要直接数据绑定(bind)到 WCF 代理类。创建仅客户端模型并转换为有效实体(WCF 代理类)是非常有效的。您可以使用 automapper 之类的工具轻松完成此操作。
关于c# - 未定义的枚举 & WPF ComboBox & WCF 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3759541/