我有定義的兩個接口如下:C#泛型和集合
public interface IFoo
{
...
}
Public interface IFooWrapper<T> where T : IFoo
{
T Foo {get;}
}
我希望能夠宣佈IFooWrappers的集合,但我不希望指定的IFoo的實施。
理想我想要做的事,如:
IList<IFooWrapper<*>> myList;
我不能想出解決的辦法。
我有定義的兩個接口如下:C#泛型和集合
public interface IFoo
{
...
}
Public interface IFooWrapper<T> where T : IFoo
{
T Foo {get;}
}
我希望能夠宣佈IFooWrappers的集合,但我不希望指定的IFoo的實施。
理想我想要做的事,如:
IList<IFooWrapper<*>> myList;
我不能想出解決的辦法。
public interface IFoo
{
...
}
public interface IFooWrapper : IFoo
{
...
}
public interface IFooWrapper<T> : IFooWrapper
where T : IFoo
{
...
}
IList<IFooWrapper> myList;
這是一種方法,做你想做的
我的第一個思想。 – 2009-08-04 09:50:15
這有什麼錯
IList<IFooWrapper<IFoo>> myList?
確實! List
public class FooWrapper : IFooWrapper<IFoo>
我要建議的是矯枉過正大多數情況下是什麼,因爲通常你可以在層次結構中創建一個可以使用的接口。不過,我認爲這是在某些方面是最靈活的解決方案,以及你想要的最忠實代表:
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 – 2009-08-04 09:49:46