我有以下代码片段

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

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


IsArmed是布尔值,
StateEnum具有以下结构

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

}


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

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

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

更新资料

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

以下是相关属性和私人成员:

[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上至关重要,
撤防时显示为“无法到达”。
仍然可以通过不同的方法从不同的代码区域进行更新-但我不想显示它,只需将其保存在其他位置-并在重新布防时显示最近的状态。
这就是我的“非对称”二传手的原因。
这是Arm&Disarm的实现(从客户端调用)

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

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


希望我能为您提供所需的信息。
谢谢,
娜or

最佳答案

首先,非常重要的一点是您必须将实现与合同分开。

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

然后将所有引用从DeviceState =更改为SetDeviceState

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

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

这样您就可以更容易地发现更新序列逻辑中是否有错误。

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

10-12 21:28