簡體   English   中英

C#泛型和集合

[英]C# Generics and Collections

我有兩個定義如下的接口:

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;

這是做你想要的一種方式

怎么了

IList<IFooWrapper<IFoo>> myList?
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<IExistsFooWrapper>的實例,該實例可以像IList<IFooWrapper<*>> 缺點是您需要創建一個類來封裝要在每個元素上運行的邏輯:

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

...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM