2009-08-04 19 views
2

私は次のように定義されている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 –

答えて

2
public interface IFoo 
{ 
... 
} 

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

これはあなたが普通のことができますので、私が提案することを約だ何

IList<IFooWrapper<IFoo>> myList? 
+0

私の最初の欠点は、あなたが各要素に対して実行するロジックをカプセル化するクラスを作成する必要がありますです思想。 –

2

は、ほとんどの状況のた​​めにやり過ぎでやりたい方法です使用できる階層の上位にインターフェイスを作成します。しかし、私は、これはいくつかの点で最も柔軟なソリューションであると思うし、あなたが何をしたいの最も忠実な表現:

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

... 
+0

確かに! リスト> myList =新しいリスト>(); – redcalx

+1

IFooWrapper は、FooがIFoo ...を実装していても、IFooWrapper を継承しません(ただし、共分散を実装するC#4を使用している場合を除く) –

+1

List > fooWrapperList =新しいリスト>(); IFooWrapper concreteWrapper = new ConcreteFooWrapper (); fooWrapperList.Add(concreteWrapper); – redcalx

0
public class FooWrapper : IFooWrapper<IFoo> 
0

と間違って何

関連する問題