Определение сгенерированного перечисления, вызывающее проблемы на стороне клиента
У меня такая ситуация, когда у меня есть
- Служба 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 от клиента к серверу,
- что я должен сделать, чтобы преодолеть это.
- можем ли мы переопределить это перечисление 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;