【问题标题】:WCF exposing generic type 'T'WCF 公开泛型类型“T”
【发布时间】:2014-11-29 14:52:06
【问题描述】:

我在这里为插入和删除操作编写了一个 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”?

【问题讨论】:

标签: wcf


【解决方案1】:

我觉得不可能,怎么会这样生成wsdl?

你有两个选择:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 完美。帮助很大!
    • 那篇文章中关于如何删除哈希的有用提示! [DataContract(Name = "MyGenericObjectUsing{0}"] 公共类 MyGenericObject
    【解决方案3】:
    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();
      

    这是我们在 Server 中看到的,在使用通用数据合约时,我们必须指定类型,否则会导致编译时错误。

    在客户端,我们从 WSDL 获得的信息如下:

    [DataContract]
    public class MyGenericObjectOfint
    

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

    使用的约定是

    通用类名 + "Of" + 类型参数名 + 哈希

    哈希并不总是生成,只有在有名字冲突的时候才会生成。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多