anc*_*dev 8 c# silverlight wcf inheritance
我有一个名为contact的抽象类,另一个名为client的类继承自contact.我正在使用带有类型联系参数的方法处理WCF服务.但是我拥有的是我想传递的客户端实例.我面临这个错误:
输入数据合约名称为"客户:http://schemas.datacontract.org/2004/07/xxx"的"xxx.Client"不是预期的.将任何静态未知的类型添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中.
你需要让DataContractSerializer知道a Client
是一种类型Contact
.
有几种方法可以做到这一点,但它们都围绕着使用KnownType
属性或ServiceKnownType
属性.
该KnownType
可放置在Client
类地告诉DataContractSerializer的,这是一个KnownType Contact
.
[DataContract]
[KnownType(typeof(Client))]
public class Contact{}
Run Code Online (Sandbox Code Playgroud)
该KnownType
也可以放在一类,表明这个串行化类时,你可能还会遇到这样其他类.
如果您的DataContract
类具有Contact
可能实际包含的属性,则可能需要执行此操作Client
:
[DataContract]
[KnownType(typeof(Client))]
public class Meeting
{
Contact MeetingContact{get;}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您可以在不指定客户端上的KnownType的情况下离开.如果您有一个返回集合的属性,并且您想要指定集合中可以包含的类型,则可能还需要执行此操作.
您可以指定静态方法的名称,而不是指定KnownType的实际类型,而该方法将返回已知类型:
[DataContract]
[KnownType("GetKnownTypes")]
public class Meeting
{
Contact MeetingContact{get;}
private static Type[] GetKnownType()
{
return new Type[]{typeof(Client)};
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以通过配置文件指定已知类型.
ServiceKnownTypes以类似的方式工作,但在服务本身上指定:
[ServiceKnownType(typeof(Client))]
[ServiceContract()]
public interface IMyServiceContract
{
[OperationContract]
Contact GetContact();
}
Run Code Online (Sandbox Code Playgroud)
这个设置将让DataContactSerializer知道任何方法都可以返回一种类型Client
.以与已知类型类似的方式,您还可以使用静态方法来提供已知类型的服务.
WCF不直接用于抽象类.您应在datacontract或服务类上使用KnownType属性.以下是例子;
[DataContract]
[KnownType(typeof(Client))]
public class Contact
{
...
}
[ServiceContract]
[ServiceKnownType(typeof(Client))]
public interface IMyService
{
contact getcontact(Guid id);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5191 次 |
最近记录: |