2009-08-04 176 views
2

我有定義的兩個接口如下:C#泛型和集合

public interface IFoo 
{ 
... 
} 

Public interface IFooWrapper<T> where T : IFoo 
{ 
    T Foo {get;} 
} 

我希望能夠宣佈IFooWrappers的集合,但我不希望指定的IFoo的實施。

理想我想要做的事,如:

IList<IFooWrapper<*>> myList; 

我不能想出解決的辦法。

+0

參見:http://stackoverflow.com/questions/833447/833475#833475 – 2009-08-04 09:49:46

回答

2
public interface IFoo 
{ 
... 
} 

public interface IFooWrapper : IFoo 
{ 
... 
} 
public interface IFooWrapper<T> : IFooWrapper 
where T : IFoo 
{ 
... 
} 
IList<IFooWrapper> myList; 

這是一種方法,做你想做的

+0

我的第一個思想。 – 2009-08-04 09:50:15

2

這有什麼錯

IList<IFooWrapper<IFoo>> myList? 
+0

確實! List > myList = new List >(); – redcalx 2009-08-04 09:54:18

0
public class FooWrapper : IFooWrapper<IFoo> 
0

我要建議的是矯枉過正大多數情況下是什麼,因爲通常你可以在層次結構中創建一個可以使用的接口。不過,我認爲這是在某些方面是最靈活的解決方案,以及你想要的最忠實代表:

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)); 
    } 

...