2

我的中间层有一个方便的集合,用于收集属于父事物的子事物。

public class ChildCollection<TParent, TChild>
{
    public IEnumerable<TChild> GetChildren();
    etc.
}

在界面中,我有一个方便的网格,可以显示 ChildCollection<TParent,TChild> 的内容并让用户对其进行操作。

public abstract class ChildCollectionGrid<TCollection, TParent, TChild> : MyGridControl
    where TCollection : ChildCollection<TParent, TChild>
{
    public abstract TCollection Collection;
    etc.
}

继承此类以使网格与 Widget 上的 Waffles 一起使用最终看起来像这样。

public class WidgetWafflesGrid : ChildCollectionGrid<WidgetWafflesCollection, Widget, Waffle>

这有点多余。WidgetWaffleCollectionChildCollection<Widget,Waffle>。指定第一个泛型类型参数后,除非您准确指定另外两个,否则该类将无法编译。

有没有更漂亮的方法来实现这一点,编译器可以推断出其他两种类型?我知道我很挑剔,但理想情况下我希望类声明看起来像:

public class WidgetWafflesGrid : ChildCollectionGrid<WidgetWafflesCollection>

谢谢你的帮助!

4

3 回答 3

2

不,没有。泛型参数推断仅适用于方法。

于 2012-08-01T19:33:33.513 回答
1

为什么要从你的收藏中获得?保持这样的状态:

public abstract class ChildCollectionGrid<TParent, TChild> : MyGridControl
{
    public abstract ChildCollection<TParent, TChild> Collection;
    etc.
}

public class WidgetWafflesGrid : ChildCollectionGrid<Widget, Waffle>
{  
}
于 2012-08-01T19:44:51.980 回答
1

使用泛型处理集合中的继承的唯一方法是使用Collection<TCollection,TChild> : where TCollection : Collection<TCollection,TChild> { }模式。

这是一个带有具体类的示例

public abstract class Collection<TCollection, TChild>
    where TCollection : Collection<TCollection, TChild>, new()
{
    protected Collection()
    {
        List=new List<TChild>();
    }
    protected List<TChild> List { get; set; }

    public TCollection Where(Func<TChild, bool> predicate)
    {
        var result=new TCollection();
        result.List.AddRange(List.Where(predicate));
        return result;
    }

    public void Add(TChild item) { List.Add(item); }
    public void AddRange(IEnumerable<TChild> collection) { List.AddRange(collection); }
}

public class Waffle
{
    public double Temperature { get; set; }
}

public class WafflesCollection : Collection<WafflesCollection, Waffle>
{
    public WafflesCollection BurnedWaffles
    {
        get
        {
            return Where((w) => w.Temperature>108);
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        WafflesCollection waffles=new WafflesCollection();

        // Count = 3
        waffles.Add(new Waffle() { Temperature=100 });
        waffles.Add(new Waffle() { Temperature=120 });
        waffles.Add(new Waffle() { Temperature=105 });

        var burned=waffles.BurnedWaffles;
        // Count = 1
    }
}
于 2012-08-02T15:33:45.607 回答