Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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
WCF公开泛型类型';T';_Wcf - Fatal编程技术网

WCF公开泛型类型';T';

WCF公开泛型类型';T';,wcf,Wcf,我为Insert和delete操作编写了一个WCF服务,这里我们使用了泛型方法,但它给出了以下错误 “System.Runtime.Serialization.InvalidDataContractException:无法将类型“T”导出为架构类型,因为它是开放泛型类型。只有当泛型类型的所有泛型参数类型都是实际类型时,才能导出泛型类型。” 这里“EntityBase2”是所有实体的基类 [ServiceContract] [ServiceKnownType(typeof(EntityBase2)

我为Insert和delete操作编写了一个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;        
}
[服务合同]
[ServiceKnownType(类型(EntityBase2))]
公共接口IBackupUtility
{
[经营合同]
作废删除(T实体),其中T:EntityBase2;
[经营合同]
无效插入更新(T实体),其中T:EntityBase2;
}

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

我认为这是不可能的,它如何以这种方式生成wsdl

您有两个选择:

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

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


这篇文章确实很古老,但也许有人会觉得这个解决方案很有用:

  • 这个问题的答案是“是”和“否”。对于预期的服务器,答案是“是”,对于预期的客户端,答案是“否”
  • 我们可以在服务器上创建泛型数据协定,但在任何操作协定中使用该协定时,我们必须指定泛型的数据类型
  • 在客户端,数据契约将仅作为一种强数据类型而非泛型公开

    [DataContract]
    public class MyGenericObject<T>
    {
       private T _id;
    
       [DataMember]
       public T ID
       {
          get { return _id; }
          set { _id = value; }
       }
    }
    
    [OperationContract]
    MyGenericObject<int> GetGenericObject();
    
    我们可以在这里看到,我们从WSDL得到的不是一个通用的数据契约—WSDL代理使用某种约定生成一个具有新名称的类

    使用的惯例是

    泛型类名+类型参数名+哈希


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

    完美的可能重复。帮助很大!文章中关于如何删除散列的有用提示![DataContract(Name=“MyGenericObjectising{0}”]公共类MyGenericObject@Vikas...do你知道我有没有办法打破这个惯例吗?@JohnnyWu…请检查这个链接-
    [DataContract]
    public class MyGenericObjectOfint