我的中间层有一个方便的收藏品,用于收集属于父母用品的儿童用品。
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>
感谢您的帮助!
答案 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
}
}