2016-12-28 24 views
3

Я пытаюсь использовать ImpromptuInterface, чтобы решить вопрос, который у меня есть. Adding Interface Implementation to ExpandoObject.'ExpandoObject' не содержит определения для 'PropertyChanged'

Теперь я могу получить доступ к различным свойствам моего интерфейса в базовом классе, но я больше не могу подписаться на событие PropertyChanged от ExpandoObject.

В процессе устранения неполадок я смог упростить проблему, как показано на рисунке.

Service.cs

using ImpromptuInterface; 

public Service() 
{ 
    InitializeComponent(); 

    dynamic expando = new ExpandoObject(); 

    try 
    { 
     INotifyPropertyChanged obj = Impromptu.ActLike(expando); 

     obj.PropertyChanged += obj_PropertyChanged; 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
    } 

    try 
    { 
     INotifyPropertyChanged obj = Impromptu.ActLike<INotifyPropertyChanged>(expando); 

     obj.PropertyChanged += obj_PropertyChanged; 
    } 
    catch (Exception ex) 
    { 
     EventLog.WriteEntry(ex.ToString(), EventLogEntryType.Error); 
    } 
} 

private void obj_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    throw new NotImplementedException(); 
} 

Я получаю ошибку о том, что

'System.Dynamic.ExpandoObject' не содержит определение для 'PropertyChanged'

Это происходит каждый раз, когда я пытаюсь подключить обработчик событий в конструкторе.

Журнал событий 1

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'PropertyChanged' 
    at CallSite.Target(Closure , CallSite , Object) 
    at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0) 
    at ActLike_INotifyPropertyChanged_dc51b6c65bf147d0b5f35218102e3c11.add_PropertyChanged(PropertyChangedEventHandler value) 
    at Service..ctor() 

Журнал событий 2

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'System.Dynamic.ExpandoObject' does not contain a definition for 'PropertyChanged' 
    at CallSite.Target(Closure , CallSite , Object) 
    at ActLike_INotifyPropertyChanged_dc51b6c65bf147d0b5f35218102e3c11.add_PropertyChanged(PropertyChangedEventHandler value) 
    at Service..ctor() 

Могу ли я не разрешено использовать ImpromptuInterface этот путь?

+0

С тех пор, как я играл с ним, это выглядит как ошибка с 'ЭкспромтомИнтерфейсом'. Я бы [сообщил об ошибке] (https://github.com/ekonbenefits/impromptu-interface/issues) –

ответ

0

Проблема возникает из-за того, что ImpromptuInterface использует DLR, а DLR не будет работать с явными вызовами интерфейса, как это реализовано на Expando. Возможно, можно было бы установить в общем случае путем проверки прокси-сервера, если его цель реализует точный интерфейс impromptu, это упаковка. Мне придется больше об этом думать. Отслеживание с этим issue.

Как работа для этой конкретной проблемы, Dynamitey.Dynamic.Dictionary: BaseDictionary работает так же, как и expando, и имеет свойство PropertyChanged как свойство обычного события.