编辑 示例中的Mistyped属性名称
我们假设我们有这样的接口
public interface IBase {}
public interface IItf_1: IBase {}
public interface IItf_2: IBase {}
public interface IItf_3: IBase {}
public interface IInterfaceHolder<T>: IBase, INotifyPropertyChanged {
// Changes to this property caused raise of the PropertyChanged event
bool Checked { get; set; }
T Item { get; }
}
public interface ISomeFunnyInterface: INotifyPropertyChanged {
IEnumerable<IInterfaceHolder<IItf_1>> Collection_1 { get; }
IEnumerable<IInterfaceHolder<IItf_2>> Collection_2 { get; }
IEnumerable<IInterfaceHolder<IItf_3>> Collection_3 { get; }
}
我们的想法是将PropertyChanged从每个Checked属性隧道传输到从ISomeFunnyInterface引发的PropertyChaned,并使用相应的属性名称(除了'Checked'之外的其他属性)。
显而易见的解决方案是通过接口IInterfaceHolder处理每个PropertyChanged发送。但问题是当我编写处理程序时:
private void GenericSelectorSelected_PropertyChanged(object sender, PropertyChangedEventArgs e) {
dynamic el = (dynamic)sender;
// here an exception is thrown, because sender (or more correctly 'el') is
// handled as IBase, and not as IInterfaceHolder
if (el.Checked) {
}
else {
}
}
如何解决这个问题?如何使其工作而无需为每个IInterfaceHandler编写单独的处理程序&lt;。&gt;
答案 0 :(得分:0)
如果你想要的只是通用接口实现而不是你正在做的事情,你可以使用ImpromptuInterface(可通过nuget获得)。它允许您子类化DynamicObject,然后为它提供一个静态接口。
IItf_1 test1 = Impromptu.ActLike<IItf_1>(myDynamicObject);