C# 具有接口和通用模型的WCF

C# 具有接口和通用模型的WCF,c#,wcf,generics,interface,C#,Wcf,Generics,Interface,关于WCF中的接口和泛型,有很多问题,但我找不到一个与我相同的问题 我有一项合同服务: [ServiceContract] [ServiceKnownType(typeof(CollectionWrapper<IAssociation>))] public interface IService : { [OperationContract] ICollectionWrapper<IAssociation> FindAssociation(string n

关于WCF中的接口和泛型,有很多问题,但我找不到一个与我相同的问题

我有一项合同服务:

[ServiceContract]
[ServiceKnownType(typeof(CollectionWrapper<IAssociation>))]
public interface IService : 
{
    [OperationContract]
    ICollectionWrapper<IAssociation> FindAssociation(string name, int pageSize, int page);
}

public interface ICollectionWrapper<TModel>
{
    int TotalCount { get; set; }
    IEnumerable<TModel> Items { get; set; }
}

[KnownType(typeof(OrganizationDto))]
[KnownType(typeof(CompanyDto))]
public class CollectionWrapper<TModel> : ICollectionWrapper<TModel>
{
    [DataMember]
    public int TotalCount { get; set; }
    [DataMember]
    public IEnumerable<TModel> Items { get; set; }
}

public class CompanyDto :  IAssociation
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class OrganizationDto :  IAssociation
{
    public int Id { get; set; }
    public string Name { get; set; }
}
然后,每种方法都会起作用,但决不能同时起作用。知道如何让它工作吗?我不想使用具体的类

这就是我尝试过的(但失败了):

[ServiceKnownType(typeof(CollectionWrapper))]
[ServiceKnownType(typeof(CollectionWrapper))]
我还尝试为iSociation和ICustomer分配一个公共接口,但都不起作用

[ServiceKnownType(typeof(CollectionWrapper<ISomething>))]
[ServiceKnownType(typeof(CollectionWrapper))]
它适用于
IEnumerable
IList
,但不适用于my
ICollectionWrapper

编辑:

iccustomer
iasociation
(及其实现)没有任何共同之处。它们不相互继承任何内容,也没有任何其他公共依赖项。

[OperationContract]
[OperationContract]
ICollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);
ICollectionWrapper搜索(ISearchQuery);
服务如何知道ISearchQuery参数存在哪些已知类型


我认为您需要在服务定义中添加
[KnownType(typeof(SearchQuery))]
(或者您的ISearchQuery实现被称为什么)。

经过大量研究,我无法找到一个好的解决方案,但我想我会发布最终得到的解决方案(即使它没有按照我想要的方式解决)

[服务合同]
[ServiceKnownType(类型(CompanyTo>)]
[ServiceKnownType(类型(CompanyTo>)]
[ServiceKnownType(typeof(CustomerTo))]
[ServiceKnownType(typeof(OrganizationDto))]
公共接口设备:
{
[OperationContract]//具体类型
CollectionWrapper FindAssociation(字符串名称、int-pageSize、int-page);
[OperationContract]//具体类型
CollectionWrapper搜索(ISearchQuery-searchQuery);
}
它只是通过使用具体类而不是接口来解决的。这不是我真正想要的,但现在它解决了我的问题

此处可能重复:


内部异常可能会给您提供更好的线索:类型WcfService1.CollectionWrapper
1[WcfService1.icCustomer]'无法添加到已知类型的列表中,因为已存在具有相同数据协定名称“”的另一类型WcfService1.CollectionWrapper
1[WcfService1.iaSociation]'。如果存在特定类型的不同集合(例如ListTest和Test[]),则不能将它们都作为已知类型添加。考虑仅指定这些类型中的一种用于添加到已知类型列表。一种可能的解决方案是创建,例如,代码>公共类客户集合:IcLink包装器< /代码>和<代码>公共类关联集合:IcLink包装器< /代码> @ @ JStuff-谢谢您的建议。我已经编辑了我的问题并添加了内部异常。这和你提到的不一样。你的其他建议可能会奏效,但需要更多做同样事情的模型,我希望避免这样做。但这是一个很好的最后手段。好吧,你发布的内部异常也不能解释太多。。。也许除了类型冲突之外,您还有其他问题。我提出的解决方案实际上是可行的。但我认为真正的解决方案是你需要弄清楚你的类/接口层次结构。你完全正确。但在本例中,我尝试将ISearchQuery更改为字符串。因此,即使这也是一个问题,也不是导致错误的原因。此外,只要我删除其他ServiceKnownType,该方法本身就可以工作。我想我不会将其标记为asnwer,因为它不能真正回答我最初的问题(使用泛型而不使用具体类)。我希望有更好的答案。。。
[ServiceKnownType(typeof(CollectionWrapper<ICustomer>))]

[ServiceKnownType(typeof(CollectionWrapper<IAssociation>))]
[ServiceKnownType(typeof(CollectionWrapper<object>))]

[ServiceKnownType(typeof(CollectionWrapper<>))]
[ServiceKnownType(typeof(CollectionWrapper<ISomething>))]
[OperationContract]
ICollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);
[ServiceContract]
[ServiceKnownType(typeof(CompanyDto>))]
[ServiceKnownType(typeof(CompanyDto>))]
[ServiceKnownType(typeof(CustomerDto))]
[ServiceKnownType(typeof(OrganizationDto))]
public interface IService : 
{
    [OperationContract] // Concrete type
    CollectionWrapper<IAssociation> FindAssociation(string name, int pageSize, int page);

    [OperationContract] // Concrete type
    CollectionWrapper<ICustomer> Search(ISearchQuery searchQuery);
}