C# 枚举 DataMember 在 WCF 中更改其值

标签 c# wcf enums datamember

我有以下代码片段

[DataMember]
public StateEnum DeviceState
    {
        get
        {
            return _deviceState;
        }
        set
        {               

            if (IsArmed)
            {
                _deviceState = value;
            }
            else
            {
                _whileDisarmState = value;
            }              
        }
    }

虽然 IsArmed 是 bool 值,
StateEnum 具有以下结构

    [DataContract]
public enum StateEnum
{
    [EnumMember]
    ERROR,
    [EnumMember]
    CONNECTED,
    [EnumMember]
    DISCONNECTED,
    [EnumMember]
    DISARMED,
    [EnumMember]
    ALARM,
    [EnumMember]
    WARNING,

}

我有一个调用服务器并获取对象列表的方法,其中 DeviceState 是其成员之一。 当我在返回列表之前在服务器端中断时,其中一个对象具有 DeviceState = StateEnum.DISCONNECTED 值,
但是当我在客户端中断时,我对同一个对象有 StateEunm.ERROR 值。

我很确定问题出在 IsArmed bool 值上。 尝试 DataMember 它没有帮助,以及将 [KnownType(typeof(StateEnum))] 添加到对象本身。

还有一件事,这个枚举在客户端是已知的,在添加这个 if 语句之前它工作得很好。

更新

我会尝试用更多代码片段来解释我的逻辑,
虽然这是复杂的代码,但不确定我能否完整地描述它。

以下是相关属性和私有(private)成员:

[DataMember]
    public bool IsArmed
    {
        get { return _isArmed; }
        set { _isArmed = value; }
    }

public StateEnum WhileDisarmState
    {
        get { return _whileDisarmState; }
        set { _whileDisarmState = value; }
    }

#region Private Members

    private StateEnum _deviceState;
    private bool _isArmed;
    private StateEnum _whileDisarmState;

    #endregion

DeviceState 和 WhileDisarmState 在构造函数中获取其初始值:

IsArmed = true;    
WhileDisarmState = StateEnum.DISCONNECTED;
DeviceState = StateEnum.DISCONNECTED;

DeviceState 在客户端 UI 中占有重要地位,
撤防时显示“无法到达”。 它仍然可以通过不同的方法从不同的代码区域进行更新 - 但我不想显示它,只需将其保存在其他地方 - 并在再次武装时显示最近的状态。
这就是我的“不对称” setter 的原因。 这是布防和撤防的实现(从客户端调用)

public virtual void Arm()
    {
        IsArmed = true;
        DeviceState = WhileDisarmState;
        IsUpdated = true;
    }

    public virtual void DisArm()
    {
        DeviceState = StateEnum.DISARMED;
        IsArmed = false;
        IsUpdated = true;
    }

我希望我为您提供了您需要的尽可能多的信息。
谢谢,
纳尔。

最佳答案

首先非常重要的一点是,您必须将实现契约(Contract)分开。

保留 DeviceState 的标准 setter 和 getter,并根据 setter 的当前代码实现单独的 SetDeviceState 方法

并将所有引用相应地从 DeviceState = 更改为 SetDeviceState

之后,如果需要,如果您有可能构建和测试服务的“调试”版本,我建议向对象添加一个临时 TraceHelper 属性,例如每次更新 DeviceState 和 IsArmed 时都会以附加模式更新的简单字符串

并且可能还跟踪所有调用者方法...

以便您可以更轻松地发现更新顺序逻辑中是否存在错误..

关于C# 枚举 DataMember 在 WCF 中更改其值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39188540/

相关文章:

c# - 有没有办法在单个应用程序中为一个 WCF 调用指定 TLS 1.0,为另一个 WCF 或 WebClient 调用指定 TLS 1.2?

ruby-on-rails - 检查来自另一个对象的 ruby​​ 枚举

java - 保存条件逻辑的枚举 - 可能吗?

c# - 将 CSV header 与 map 类进行比较

c# - 将对象设置为 null 与 Dispose()

c# - Redis ServiceStack - 轻松获取和设置一组值?

java - 枚举抛出 "Is Not An Enum Type"

c# - 无法读取cookie

http - 添加到服务器响应但未从服务器返回的 WCF 自定义 HTTP header

c# - 如何从远程 WCF 服务捕获异常?