实现通用接口的通用功能

时间:2011-07-25 17:05:20

标签: c#-4.0 interface generics

编辑 示例中的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;

1 个答案:

答案 0 :(得分:0)

如果你想要的只是通用接口实现而不是你正在做的事情,你可以使用ImpromptuInterface(可通过nuget获得)。它允许您子类化DynamicObject,然后为它提供一个静态接口。

IItf_1 test1 = Impromptu.ActLike<IItf_1>(myDynamicObject);