我的客户获得了以下回调合同:
[ServiceContract]
interface IEvent
{
[OperationContract(IsOneWay = true)]
void OnEvent(string serverName, string changeType, List<myObject> myObjects);
}
并获得了一个实现 IEvent 的课程如下:
class myClass : IEvent{
public void OnEvent(string serverName, string changeType, List<myObject> myObjects)
{
MessageBox.Show(@"Event Called: " + changeType + @" occured at: " + serverName + @" got " + myObjects.Count + " myObjects!");
}
}
我的服务器获得了以下发布代码:
methodInfo.Invoke(client, new object[] {serverName, changeType, myObjects});
当我使用methodInfo.Invoke和myObjects = new List<myobject>(){}
时
一切正常,意味着当服务器使用methodinfo.invoke时调用myClass.OnEvent
和mbox显示
BUT
当我尝试发送myObjects = new List<myobject>(){new MyDerivedObject()}
时,它不起作用意味着当服务器使用methodinfo.invoke时,myClass.OnEvent被 NOT 调用
并且mbox 不显示
服务器和客户端都包含对myObject和MyDerivedObject的myObject DLL的引用 MyDerivedObject当然是从myObject
派生的请帮助
答案 0 :(得分:3)
@eugene给出的示例也可以应用于服务合同,因此在您的情况下,您可以将ServiceKnownType应用于回调合同。
[ServiceContract]
[ServiceKnownType(typeof(MyDerivedObject))]
interface IEvent
{
[OperationContract(IsOneWay = true)]
void OnEvent(string serverName, string changeType, List<myObject> myObjects);
}
答案 1 :(得分:0)
要使WCF能够使用派生类,应为每个派生类使用KnownType
属性修饰基类。不幸的是,这意味着基类应该知道它的派生类。在你的情况下,它将像:
[KnownType(typeof(MyDerivedObject))]
[DataContract]
class myobject
{
// ...
}