具有Closed的WCF服务操作在客户端中不可见的通用返回类型

时间:2013-12-11 20:08:09

标签: c# wcf generics

我创建了一个带有封闭泛型返回类型的WCF服务操作。我希望将封闭的泛型引用为设计时间名称,而不是运行时名称。实施例

服务

[ServiceContract]
public interface IService1
{
    [OperationContract]
    Food<BurritoKinds> GetBurrito();
}

[DataContract]
public class Food<T>
{
    public T Detail { get; set; }
}

[DataContract]
public enum BurritoKinds
{
    [EnumMember]
    Bean,
    [EnumMember]
    Beef
}

public class Service1 : IService1
{
    public Food<BurritoKinds> GetBurrito()
    {
        return new Food<BurritoKinds> { Detail = BurritoKinds.Beef };
    }
}

和客户

    static void Main(string[] args)
    {
        var client = new Service1Client();
        Food<BurritoKinds> burrito = client.GetBurrito();         //Compile Error
        FoodOfBurritoKindsSSCqoCp1 burrito2 = client.GetBurrito();//Works Fine
    }

我想在引用类型时使用Food<BurritoKinds>而不必使用FoodOfBurritoKindsSSCqoCp1。我不想允许这样做,或者只是为了保存Generic并与服务和客户共享它而不创建新的DLL?谢谢。

1 个答案:

答案 0 :(得分:0)

检查http://jeffbarnes.net/blog/post/2007/05/10/WCF-Serialization-and-Generics.aspx Jeff Barnes指出wsdl(而不是wcf)限制了泛型类型的使用:对于消费者来说,它们总是作为具体类型出现。但是,您的.Net代码中的泛型可能会生成不同的具体类型,就像您的FoodOfBurritoKindsSSCqoCp1类型一样。请注意,use可以使用DataContract属性指定生成类型的名称,例如[DataContract(Name =“FoodOf {0}”],它应该在wsdl中为消费者生成FoodOfBurritoKinds。