我为插入和删除操作编写了一个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'?
答案 0 :(得分:7)
我认为这是不可能的,它怎么能以这种方式生成wsdl?
您有两种选择:
您可以将类型作为参数发送。
如果您想公开实体的crud操作,我建议使用代码生成器,也许是EF的T4模板。
答案 1 :(得分:7)
这篇文章确实很老了,但也许有人觉得这个解决方案很有用: WCF and Generics
答案 2 :(得分:1)
在客户端,数据合同将仅作为非通用的强数据类型公开。
[DataContract]
public class MyGenericObject<T>
{
private T _id;
[DataMember]
public T ID
{
get { return _id; }
set { _id = value; }
}
}
[OperationContract]
MyGenericObject<int> GetGenericObject();
这是我们在服务器中可以看到的,在使用通用数据合同时我们必须指定类型,否则它会给编译时错误。
在客户端上,我们从WSDL获得的是以下内容:
[DataContract]
public class MyGenericObjectOfint
我们可以在这里看到我们从WSDL获得的不是通用数据协定WSDL代理使用某种约定生成具有新名称的类。
使用的公约是
通用类名+&#34; Of&#34; +类型参数名称+哈希
并不总是生成哈希值,只有在有可能发生名称冲突时才会生成哈希值。