2

我有这样的情况,我有

  • WCF 服务 (VS2008) 托管在某处
  • 主要解决方案(VS2005),它有一个“类库”类型的消费者项目,服务引用到这个 WCF 服务
  • 在数据合同中,我有一个数据成员如下......

    [DataContract]
    public class Cmd
    {
       [DataMember]
       public string CommandText;
       [DataMember]
       public CommandType CommandType;
    }
    

代理 service.cs 是在我的消费者项目的服务参考文件夹中生成的(可能是因为我使用的是 vs 2005),其中包含服务的所有声明,其中 enum CommandType 已获得新定义

[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "3.0.4506.30")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://schemas.datacontract.org/2004/07/System.Data")]
public enum CommandType
{
    Text,
    StoredProcedure,
    TableDirect,
}

而不是来自 System.Data 的原始枚举

public enum CommandType
{    
    Text = 1,    
    StoredProcedure = 4,    
    TableDirect = 512,
}

这会导致从客户端到服务器的 CommandType 值分配不正确,

  1. 我应该怎么做才能克服这一点。
  2. 我们能否在 WCF 服务上覆盖此 CommandType 枚举以在整个过程中获得相同的枚举定义。

抱歉这么长的问题陈述......

4

2 回答 2

0

尝试定义您自己的明确继承自 int 的枚举,然后在自定义枚举到达服务器时从您的自定义枚举转换为 System.Data 枚举:

public enum MyEnum : int {    
    Text = 1,    
    StoredProcedure = 4,    
    TableDirect = 512,
}

服务器端:

CommandType t = (CommandType)myEnumVariable;
于 2011-08-17T06:59:25.133 回答
0

WCF 中的枚举只是字符串。您的 CommandType 值将作为“Text”、“StoredProcedure”等存在于 SOAP 有效负载中。只有在服务器端才能将它们转换为整数。如果您想在合同中使用 int 值,则必须将 Cmd.CommandType 定义为 int 并通过“KnownTypes”指令公开您的枚举。不过,这违背了它作为枚举的目的。或者,完全避免在客户端进行投射。

于 2011-08-17T07:13:03.777 回答