通用类型参数推断

时间:2012-08-01 19:30:58

标签: c# generics

我的中间层有一个方便的收藏品,用于收集属于父母用品的儿童用品。

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

在界面中,我有一个方便的网格,可以显示ChildCollection的内容&lt; TParent,TChild&gt;并让用户开展工作。

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>

这有点多余。 WidgetWaffleCollection 一个ChildCollection&lt; Widget,Waffle&gt;。在指定了第一个泛型类型参数的情况下,除非您指定其他两个参数,否则该类将不会编译。

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

public class WidgetWafflesGrid : ChildCollectionGrid<WidgetWafflesCollection>

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为什么要从您的收藏中获取?保持这样:

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

public class WidgetWafflesGrid : ChildCollectionGrid<Widget, Waffle>
{  
}

答案 2 :(得分:1)

使用Generics处理集合中继承的唯一方法是使用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
    }
}