Определение сгенерированного перечисления, вызывающее проблемы на стороне клиента

У меня такая ситуация, когда у меня есть

  • Служба WCF (VS2008) где-то размещена
  • Основное решение (VS2005), в котором есть Потребительский проект типа "библиотека классов" со ссылкой на службу для этой службы WCF.
  • В договоре данных у меня есть член данных следующим образом...

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

Proxy 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. можем ли мы переопределить это перечисление CommandType в службе WCF, чтобы получить одно и то же определение перечисления.

Извините за столь долгое изложение проблемы...

2 ответа

Перечисления в WCF - это просто строки. Ваши значения CommandType будут присутствовать в полезной нагрузке SOAP как "Текст", "StoredProcedure" и т. Д. Только на стороне сервера вы можете привести их как целые числа. Если вы хотите использовать значения int в вашем контракте, то вам нужно определить Cmd.CommandType как int и выставить свой enum с помощью директивы KnownTypes. Такой вид побеждает цель быть перечислением. В качестве альтернативы, просто избегайте кастинга на стороне клиента.

Попробуйте определить свое собственное перечисление, которое явно наследует от int, и затем приведение из вашего пользовательского перечисления к перечислению System.Data, когда пользовательское перечисление поступит на сервер:

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

сторона сервера:

CommandType t = (CommandType)myEnumVariable;
Другие вопросы по тегам