"System.ComponentModel.PropertyChangedEventHandler" 无法派生自特殊类 "System.MulticastDelegate"。

6
我正在按照这里推荐的方式开发wcf服务。它解决了我在开发原始.NET 2.0 web服务时出现的命名空间冲突问题,但我又遇到了另一个问题。
我试图传递给wcf服务的对象在客户端中用于聚合用户的大量信息,并且它的一些字段与UI控件绑定(因此实现PropertyChangedEventHandler)。当我尝试在客户端项目中编译svcutil生成的代理时,我会收到标题为此问题的错误。
将所有数据从该对象中提取出来并放入发送类中(然后重新构建原始类型)似乎是多余的 - 更不用说需要花费极长的时间了。
有解决方法吗?

我有点困惑。你说你正在开发一个WCF服务,但是接着又说你正在开发一个.NET 2.0的Web服务。然而,WCF是.NET 3.0及以上版本才支持的。我的回答基于.NET 3.0。 - Richard Anthony Freeman-Hein
不,最初它是一个.NET 2.0 Web服务,但是2.0 Web服务中的命名空间冲突使设计复杂化了,因此我决定创建一个WCF服务(如我的其他问题链接中所述)。编辑以澄清。 - Steven Evers
1个回答

7
我可以确认一下吗?你是否将委托传递给Web服务?那是行不通的...它无法被序列化。在最好的情况下,ADO.NET数据服务(.NET 3.5SP1)可以通过将Expression转换为查询字符串来执行类似的操作...但这就是你能得到的最接近的方式。除此之外,你将不得不构建一个请求对象,用常规属性封装你的意图。
这适用于任何Web服务、WCF服务、TCP等。
*= 委托本质上是一种类型安全的方法句柄(带有可选的目标(实例)引用);它可以表示为XML。
(编辑)
从评论中可以看出,可能只是因为你没有对数据契约进行归因;这意味着它必须推断合同(并且它经常犯错)。例如:
[DataContract]
class Foo : IWhateverInterfaces {
    [DataMember]
    public string Bar {get;set;}

    [DataMember]
    public int Baz {get;set;}

    public float NotPartOfTheContract {get;set;}

    public event EventHandler AlsoNotPartOfTheContract;
}

使用 [DataContract] 时,只有标记了 [DataMember] 的成员才会被序列化 - 因此,事件应该被忽略。这曾经是实现 WCF 数据协定的唯一方式,但 MS 调整它从字段中推断契约... 我认为这是一个错误,因为它会导致您刚刚遇到的问题...


我最终创建了一个名为WCFDocument的对象,其中只包含原始对象中的原始字段(删除任何数据绑定等),并在原始对象中创建了一个属性,该属性构造并返回WCFDocument。...不,我没有传递任何委托。我的对象的基类继承自BindingList<T>和INotifyPropertyChangedEvent。这是你连续第二天帮助我了。再次感谢你,Marc。 - Steven Evers
所以...如果您没有明确地传递委托,我想知道您是否正确标记了WCF数据合同?从问题中我无法判断(因为没有任何说明性代码)。请参见编辑... - Marc Gravell
这对我很有帮助。花了一些时间才确定问题所在,但我在我的wsdl中只有一个实际类型的引用,其余的都是我定义的结构等。我敢打赌,如果我有不止一个引用,我永远也不会发现这个问题,但我创建了自己的类型,做了一个dump foreach,并从wsdl类型中复制它,然后它就可以工作了。谢谢。 - CarComp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接