2016-12-28 71 views
3

我正在尝试使用ImpromptuInterface来解决我在这里遇到的问题。 Adding Interface Implementation to ExpandoObject'ExpandoObject'不包含'PropertyChanged'的定义

我现在能够访问我的基类中的接口的各种属性,但我不能再订阅ExpandoObject的PropertyChanged事件。

在排除故障时,我能够简化问题,如图所示。

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

从我玩过的几分钟内,它看起来像一个'ImpromptuInterface'的bug。我会[报告错误](https://github.com/ekonbenefits/impromptu-interface/issues) –

回答

0

问题来自ImpromptuInterface使用DLR,而DLR不会使用显式接口调用,这是它在Expando上的实现方式。通过让代理检查目标是否实现了即兴包装的确切接口,可以对其进行一般修复。我不得不多想一想。跟踪这个issue

作为解决此特定问题的解决方法,Dynamitey.Dynamic.DictionaryBaseDictionary与expando一样工作,并将PropertyChanged作为常规事件属性。

相关问题