代码之家  ›  专栏  ›  技术社区  ›  Steven Evers

“System.ComponentModel.PropertyChangedEventHandler”不能从特殊类“System.MulticastDelegate”派生

  •  5
  • Steven Evers  · 技术社区  · 15 年前

    我正在开发推荐的WCF服务 here . 它解决了我在开发原始.NET2.0Web服务时出现的名称空间冲突问题,但我又遇到了另一个问题。

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

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

    有解决办法吗?

    1 回复  |  直到 15 年前
        1
  •  6
  •   Marc Gravell    15 年前

    我能查一下吗?你路过A吗 代表 到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数据契约的方式,但微软调整了它从字段推断契约…在我看来,这是个错误,因为它导致了你刚刚遇到的问题…