System.ComponentModel.PropertyChangedEventHandler не может быть производным от специального класса System.MulticastDelegate. - PullRequest
5 голосов
/ 05 июня 2009

Я разрабатываю службу wcf в соответствии с рекомендациями здесь . Это решило мою первоначальную проблему конфликтов пространства имен при разработке оригинального веб-сервиса .NET 2.0, но я столкнулся с другой проблемой.

Объект, который я пытаюсь передать службе wcf, используется в клиенте для сбора информации от пользователя, и некоторые из его полей связаны с элементами управления пользовательского интерфейса (следовательно, реализуют PropertyChangedEventHandler). Когда я пытаюсь скомпилировать прокси, сгенерированный svcutil в моем клиентском проекте, я получаю сообщение об ошибке, озаглавившее этот вопрос.

Извлечение всех данных из этого объекта и помещение их в класс для отправки (а затем восстановление исходного типа) может показаться излишним - не говоря уже о том, что это занимает смехотворно много времени.

Есть ли обходной путь?

1 Ответ

6 голосов
/ 05 июня 2009

Могу ли я проверить? Вы передаете делегат веб-службе? Это не сработает ... его нельзя сериализовать. В лучшем случае ADO.NET Data Services (.NET 3.5SP1) может сделать нечто подобное, переведя Expression в строку запроса ... но это настолько близко, насколько вы получите. Кроме того, вам придется создать объект запроса, который инкапсулирует ваше намерение с обычными свойствами.

Это относится к любому из веб-сервисов, сервисов wcf, tcp и т. Д.

* = делегат по сути является дескриптором безопасного типа (с необязательной ссылкой target (instance)); это может быть выражено, например, как 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 подправила его, чтобы вывести контракты из полей ... ошибка IMO, так как это вызывает проблему, которую вы только что имели ...

...