【发布时间】:2016-08-28 06:20:43
【问题描述】:
我有以下代码sn -p
[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 语句之前它工作得非常好。
更新
我会尝试用更多的代码 sn-ps 来解释我的逻辑,
虽然这是复杂的代码,但我不确定我能不能完整地描述它。
以下是相关的属性和私有成员:
[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;
}
我希望我能提供尽可能多的信息。
谢谢,
诺尔。
【问题讨论】:
-
bool 是在哪里定义的?它是否在列表完成并发送时被覆盖?我怀疑您需要展示更多代码(一个最小的、完整的、可验证的示例)
-
感谢您的部分更新!无论如何,这种“它仍然可以通过不同的方法从不同的代码区域更新”可能是问题的原因:) 只需仔细检查客户端上的 IsArmed 和 WhileDisarmState 是否是您所期望的,或者尝试看看会发生什么服务器直到返回对象之前...
标签: c# wcf enums datamember