通常情况下,我们无需做任何设置就可以在 WCF 中使用枚举类型。
public enum DataType
{
A,
B,
C
}
[ServiceContract]
public interface IMyService
{
[OperationContract]
void Test(DataType d);
}
{
A,
B,
C
}
[ServiceContract]
public interface IMyService
{
[OperationContract]
void Test(DataType d);
}
客户端代理
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 0,
[numMemberAttribute()]
B = 1,
[EnumMemberAttribute()]
C = 2,
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
void Test(DataType d);
}
}
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 0,
[numMemberAttribute()]
B = 1,
[EnumMemberAttribute()]
C = 2,
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
void Test(DataType d);
}
}
如果我们只想使用部分枚举值时,可以使用 EnumMemberAttribute。
[DataContract]
public enum DataType
{
[EnumMember]A,
B,
[EnumMember]C
}
public enum DataType
{
[EnumMember]A,
B,
[EnumMember]C
}
代理文件
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 0,
[EnumMemberAttribute()]
C = 2,
}
}
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 0,
[EnumMemberAttribute()]
C = 2,
}
}
我们还可以使用 EnumMemberAttribute.Value 为枚举值设置一个 "固定" 的名字,这和前面我们提到的 ServiceContract / DataContract 版本问题类似。
[DataContract]
public enum DataType
{
[EnumMember(Value="A")]Axxx,
B,
[EnumMember]C
}
public enum DataType
{
[EnumMember(Value="A")]Axxx,
B,
[EnumMember]C
}
最后要注意的是,如果我们要使用自定值的枚举类型,一定要象下面这样。
1. 在服务契约上添加 ServiceKnownType(typeof(Enum))。
2. 为枚举值添加 [EnumMember]。
[DataContract]
[Flags]
public enum DataType
{
[EnumMember]A = 1,
[EnumMember]B = 2,
[EnumMember]C = 4,
[EnumMember]D = 8
}
[ServiceContract]
[ServiceKnownType(typeof(DataType))]
public interface IMyService
{
[OperationContract]
void Test(DataType d);
}
[Flags]
public enum DataType
{
[EnumMember]A = 1,
[EnumMember]B = 2,
[EnumMember]C = 4,
[EnumMember]D = 8
}
[ServiceContract]
[ServiceKnownType(typeof(DataType))]
public interface IMyService
{
[OperationContract]
void Test(DataType d);
}
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[FlagsAttribute()]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 1,
[EnumMemberAttribute()]
B = 2,
[EnumMemberAttribute()]
C = 4,
[EnumMemberAttribute()]
D = 8,
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
void Test(DataType d);
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface IMyServiceChannel : IMyService, IClientChannel
{
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class MyServiceClient : ClientBase<IMyService>, IMyService
{
public void Test(DataType d)
{
base.Channel.Test(d);
}
}
}
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[FlagsAttribute()]
[DataContractAttribute(Namespace = "...")]
public enum DataType : int
{
[EnumMemberAttribute()]
A = 1,
[EnumMemberAttribute()]
B = 2,
[EnumMemberAttribute()]
C = 4,
[EnumMemberAttribute()]
D = 8,
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
void Test(DataType d);
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface IMyServiceChannel : IMyService, IClientChannel
{
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class MyServiceClient : ClientBase<IMyService>, IMyService
{
public void Test(DataType d)
{
base.Channel.Test(d);
}
}
}
否则,生成的客户端代理就是下面这个样子了。晕不? ![]()
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
// CODEGEN: Generating message contract since element name d from namespace
// http://tempuri.org/ is not marked nillable
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
TestResponse Test(TestRequest request);
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[MessageContractAttribute(IsWrapped = false)]
public partial class TestRequest
{
[MessageBodyMemberAttribute(Name = "Test", Namespace = "http://...", Order = 0)]
public TestRequestBody Body;
public TestRequest()
{
}
public TestRequest(TestRequestBody Body)
{
this.Body = Body;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[DataContractAttribute(Namespace = "http://tempuri.org/")]
public partial class TestRequestBody
{
[DataMemberAttribute(EmitDefaultValue = false, Order = 0)]
public string d;
public TestRequestBody()
{
}
public TestRequestBody(string d)
{
this.d = d;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[MessageContractAttribute(IsWrapped = false)]
public partial class TestResponse
{
[MessageBodyMemberAttribute(Name = "TestResponse", Namespace = "http://...", Order = 0)]
public TestResponseBody Body;
public TestResponse()
{
}
public TestResponse(TestResponseBody Body)
{
this.Body = Body;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[DataContractAttribute()]
public partial class TestResponseBody
{
public TestResponseBody()
{
}
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface IMyServiceChannel : IMyService, IClientChannel
{
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class MyServiceClient : ClientBase<IMyService>, IMyService
{
TestResponse IMyService.Test(TestRequest request)
{
return base.Channel.Test(request);
}
public void Test(string d)
{
TestRequest inValue = new TestRequest();
inValue.Body = new TestRequestBody();
inValue.Body.d = d;
TestResponse retVal = ((IMyService)(this)).Test(inValue);
}
}
}
// <auto-generated>
// 此代码由工具生成。
// 运行库版本:2.0.50727.42
//
// 对此文件的更改可能会导致不正确的行为,并且如果
// 重新生成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
namespace ConsoleApplication1.localhost
{
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[ServiceContractAttribute(ConfigurationName = "ConsoleApplication1.localhost.IMyService")]
public interface IMyService
{
// CODEGEN: Generating message contract since element name d from namespace
// http://tempuri.org/ is not marked nillable
[OperationContractAttribute(Action = "http://tempuri.org/IMyService/Test", ReplyAction = "...")]
TestResponse Test(TestRequest request);
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[MessageContractAttribute(IsWrapped = false)]
public partial class TestRequest
{
[MessageBodyMemberAttribute(Name = "Test", Namespace = "http://...", Order = 0)]
public TestRequestBody Body;
public TestRequest()
{
}
public TestRequest(TestRequestBody Body)
{
this.Body = Body;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[DataContractAttribute(Namespace = "http://tempuri.org/")]
public partial class TestRequestBody
{
[DataMemberAttribute(EmitDefaultValue = false, Order = 0)]
public string d;
public TestRequestBody()
{
}
public TestRequestBody(string d)
{
this.d = d;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[MessageContractAttribute(IsWrapped = false)]
public partial class TestResponse
{
[MessageBodyMemberAttribute(Name = "TestResponse", Namespace = "http://...", Order = 0)]
public TestResponseBody Body;
public TestResponse()
{
}
public TestResponse(TestResponseBody Body)
{
this.Body = Body;
}
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[DataContractAttribute()]
public partial class TestResponseBody
{
public TestResponseBody()
{
}
}
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public interface IMyServiceChannel : IMyService, IClientChannel
{
}
[DebuggerStepThroughAttribute()]
[GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class MyServiceClient : ClientBase<IMyService>, IMyService
{
TestResponse IMyService.Test(TestRequest request)
{
return base.Channel.Test(request);
}
public void Test(string d)
{
TestRequest inValue = new TestRequest();
inValue.Body = new TestRequestBody();
inValue.Body.d = d;
TestResponse retVal = ((IMyService)(this)).Test(inValue);
}
}
}
631

被折叠的 条评论
为什么被折叠?



