在WCF中使用泛型时,客户端的类型奇怪

时间:2012-12-02 11:55:57

标签: c# wcf

我是WCF的新手,并使用以下两种方法创建了一个服务:

[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是一个通用类:

[DataContract]
public class DbResponse<T>
{
    [DataMember]
    public DbStatus Status { get; set; }
    [DataMember]
    public string Message { get; set; }
    [DataMember]
    public T Data { get; set; }
}

其中DbStatus是枚举:

[DataContract]
public enum DbStatus
{ 
    [EnumMember]
    Ok,
    [EnumMember]
    Warning,
    [EnumMember]
    Failed
};

这很好,除了在客户端,因为将通用属性添加到DbResponse,我不能再使用以下内容:

string filter = "Foo";
DBClient dbc = new DBClient();
WebInterface.Services.DbResponse response = dbc.FindStudent(filter);

相反,根据Intellisense,我必须使用看起来很奇怪(和丑陋)的类型:

WebInterface.Services.DbResponseOfArrayOfStudentL1_PcKk2u response = dbc.FindStudent(filter);

如果有人能够解释为什么会发生这种情况以及是否(以及如何)我可以使用“更干净”的类型名称,我将不胜感激。

1 个答案:

答案 0 :(得分:3)

好的,我发现可以使用DataContract属性中的Name属性覆盖哈希值(http://jeffbarnes.net/blog/post/2007/05/10/wcf-serialization-and-generics。 C ++):

[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; }
}

这仍将输出,例如DbResponseOfArrayOfStudent,但至少没有丑陋的哈希,所以我想我将不得不忍受。