C# 在WCF中使用泛型时客户端中的奇怪类型
我对WCF比较陌生,并使用以下两种方法创建了一个服务:C# 在WCF中使用泛型时客户端中的奇怪类型,c#,wcf,C#,Wcf,我对WCF比较陌生,并使用以下两种方法创建了一个服务: [ServiceContract] public interface IDB { [OperationContract] DbResponse<Student> AddStudent(string pnr, string firstName, string lastName, string userName, string email, string cls); [OperationContract]
[ServiceContract]
public interface IDB
{
[OperationContract]
DbResponse<Student> AddStudent(string pnr, string firstName, string lastName, string userName, string email, string cls);
[OperationContract]
DbResponse<List<Student>> FindStudent(string searchString);
}
这很好,但在客户端,由于向DbResponse添加了泛型属性,因此我无法再使用以下内容:
string filter = "Foo";
DBClient dbc = new DBClient();
WebInterface.Services.DbResponse response = dbc.FindStudent(filter);
取而代之的是,根据Intellisense的说法,我必须使用奇怪的(丑陋的)类型:
如果有人能解释一下为什么会发生这种情况,以及我是否(以及如何)可以使用“cleaner”类型名称,我将不胜感激。好的,我发现可以使用DataContract属性中的name属性来覆盖哈希(http://jeffbarnes.net/blog/post/2007/05/10/wcf-serialization-and-generics.aspx):
[DataContract(Name=“DbResponse{0}]
公共类DbResponse
{
[数据成员]
公共DbStatus状态{get;set;}
[数据成员]
公共字符串消息{get;set;}
[数据成员]
公共T数据{get;set;}
}
这仍然会输出,例如DbResponseOfArrayOfStudent,但至少没有难看的散列,所以我想我不得不接受它。WCF的数据交换是通过XML序列化和XML模式完成的,而这并不真正支持泛型。这就是为什么会出现这些“混乱”的情况对于WCF数据传输,您应该只使用具体的非泛型类型。
[DataContract]
public enum DbStatus
{
[EnumMember]
Ok,
[EnumMember]
Warning,
[EnumMember]
Failed
};
string filter = "Foo";
DBClient dbc = new DBClient();
WebInterface.Services.DbResponse response = dbc.FindStudent(filter);
WebInterface.Services.DbResponseOfArrayOfStudentL1_PcKk2u response = dbc.FindStudent(filter);
[DataContract(Name = "DbResponse{0}"]
public class DbResponse<T>
{
[DataMember]
public DbStatus Status { get; set; }
[DataMember]
public string Message { get; set; }
[DataMember]
public T Data { get; set; }
}