Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在WCF中使用泛型时客户端中的奇怪类型_C#_Wcf - Fatal编程技术网

C# 在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]

我对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添加了泛型属性,因此我无法再使用以下内容:

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