WCF暴露泛型类型'T'

时间:2011-01-19 06:36:40

标签: wcf

我为插入和删除操作编写了一个WCF服务,我们在这里使用了泛型方法,但它给出了以下错误 “System.Runtime.Serialization.InvalidDataContractException:类型'T'无法导出为模式类型,因为它是一个开放的泛型类型。如果所有泛型参数类型都是实际类型,则只能导出泛型类型。”

这里“EntityBase2”是所有实体的基类

[ServiceContract]
[ServiceKnownType(typeof(EntityBase2))]
public interface IBackupUtility
{
    [OperationContract]
    void Delete<T>(T entity) where T : EntityBase2;

    [OperationContract]
    void InsertORUpdate<T>(T entity) where T : EntityBase2;        
}

问题是我如何公开泛型类型'T'?

3 个答案:

答案 0 :(得分:7)

我认为这是不可能的,它怎么能以这种方式生成wsdl?

您有两种选择:

  • 您可以将类型作为参数发送。

  • 如果您想公开实体的crud操作,我建议使用代码生成器,也许是EF的T4模板。

答案 1 :(得分:7)

这篇文章确实很老了,但也许有人觉得这个解决方案很有用: WCF and Generics

答案 2 :(得分:1)

  1. 对于这个问题的答案是肯定和否。对于服务器预期是肯定的,对于客户预期答案为否。
  2. 我们可以在服务器上创建通用数据协定,但在任何操作合同中使用它时,我们必须指定通用的数据类型。
  3. 在客户端,数据合同将仅作为非通用的强数据类型公开。

    [DataContract]
    public class MyGenericObject<T>
    {
       private T _id;
    
       [DataMember]
       public T ID
       {
          get { return _id; }
          set { _id = value; }
       }
    }
    
    [OperationContract]
    MyGenericObject<int> GetGenericObject();
    
  4. 这是我们在服务器中可以看到的,在使用通用数据合同时我们必须指定类型,否则它会给编译时错误。

    在客户端上,我们从WSDL获得的是以下内容:

    [DataContract]
    public class MyGenericObjectOfint
    

    我们可以在这里看到我们从WSDL获得的不是通用数据协定WSDL代理使用某种约定生成具有新名称的类。

    使用的公约是

    通用类名+&#34; Of&#34; +类型参数名称+哈希

    并不总是生成哈希值,只有在有可能发生名称冲突时才会生成哈希值。