2009-08-04 231 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)); 
    } 

...