【问题标题】:'System.ComponentModel.PropertyChangedEventHandler' cannot derive from special class 'System.MulticastDelegate'“System.ComponentModel.PropertyChangedEventHandler”不能从特殊类“System.MulticastDelegate”派生
【发布时间】:2009-06-05 18:49:21
【问题描述】:

我正在按照here 的建议开发 wcf 服务。它解决了我在开发原始 .NET 2.0 Web 服务时最初的命名空间冲突问题,但我遇到了另一个问题。

我试图传递给 wcf 服务的对象在客户端中用于聚合来自用户的一堆信息,并且它的一些字段数据绑定到 ui 控件(因此实现了 PropertyChangedEventHandler)。当我尝试在我的客户端项目中编译由 svcutil 生成的代理时,我收到了标题为这个问题的错误。

从这个对象中提取所有数据并放入一个类中进行发送(然后重建原始类型)似乎是多余的——更不用说花费很长的时间了。

有解决办法吗?

【问题讨论】:

  • 我很困惑。您说您正在开发 WCF 服务,但是您说您正在开发 .NET 2.0 Web 服务。但是,WCF 是 .NET 3.0+。我的答案基于 .NET 3.0。
  • 不,最初它是一个 .NET 2.0 Web 服务,但 2.0 Web 服务中的命名空间冲突使设计复杂化,所以我决定改为创建一个 wcf 服务(如链接中所述我的另一个问题)。编辑澄清。

标签: c# wcf web-services


【解决方案1】:

我可以检查吗?您是否将委托传递给网络服务?那行不通……它*不能被序列化。充其量,ADO.NET 数据服务 (.NET 3.5SP1) 可以通过将Expression 转换为查询字符串来做类似的事情......但这与您将得到的一样接近。除此之外,您还必须构建一个使用常规属性封装您的意图的请求对象。

这适用于任何 web-service、wcf 服务、tcp 等。

*=委托本质上是一个类型安全的方法句柄(带有可选的目标(实例)引用);例如,它可以表示为 xml


(编辑)

来自 cmets - 这可能只是因为您没有归因于您的数据合同;这意味着它必须推断合同(而且它经常出错)。例如:

[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 对其进行了调整以从字段中推断合同...一个错误 IMO,因为它会导致您刚刚遇到的问题...

【讨论】:

  • 我最终创建了一个名为 WCFDocument 的对象,它只是我原始对象中的原始字段(删除任何数据绑定等),并在原始对象中创建了一个属性,该属性构造并返回了 WCFDocument . ...不,我没有通过任何代表。我的对象的基类继承自 BindingList 和 INotifyPropertyChangedEvent。既然你帮助了我,那已经是连续两天了。再次感谢 Marc。
  • 所以...如果您没有明确传递委托...我想知道您是否没有正确标记您的 WCF 数据合同?我无法从这个问题中分辨出来(因为没有任何说明性代码)。查看编辑...
  • 这对我有帮助。确定这种情况需要一段时间,但我有一个对我的 wsdl 中定义的实际类型的单一引用,其余的我定义为结构等。我敢打赌,如果我有多个,我永远也不会想到这一点,但是我创建了自己的类型,做了一个转储 foreach 并从 wsdl 类型复制了它,然后它就可以工作了。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多