は、ほとんどの状況のためにやり過ぎでやりたい方法です使用できる階層の上位にインターフェイスを作成します。しかし、私は、これはいくつかの点で最も柔軟なソリューションであると思うし、あなたが何をしたいの最も忠実な表現:
public interface IFooWrapperUser<U> {
U Use<T>(IFooWrapper<T> wrapper);
}
public interface IFooWrapperUser {
void Use<T>(IFooWrapper<T> wrapper);
}
public interface IExistsFooWrapper {
U Apply<U>(IFooWrapperUser<U> user);
void Apply(IFooWrapperUser user);
}
public class IExistsFooWrapper<T> : IExistsFooWrapper {
private IFooWrapper<T> wrapper;
public IExistsFoo(IFooWrapper<T> wrapper) {
this.wrapper = wrapper;
}
public U Apply<U>(IFooWrapperUser<U> user) {
return user.Use(foo);
}
public void Apply(IFooWrapperUser user) {
user.Use(foo)
}
}
今、あなたはそれがIList<IFooWrapper<*>>
だかのように使用することができますIList<IExistsFooWrapper>
のインスタンスを作成することができます。
private class FooPrinter : IFooWrapperUser<string> {
public string Apply<T>(IFooWrapper<T> wrapper) {
return wrapper.Foo.ToString();
}
}
...
IFooWrapperUser<string> user = new FooPrinter();
foreach (IExistFooWrapper wrapper in list) {
System.Console.WriteLine(wrapper.Apply(user));
}
...
も参照してください:http://stackoverflow.com/questions/833447/833475#833475 –