我希望能够创建一个带有基类型约束的静态泛型类型,如
public static class Manager<T> where T : HasId
{
public static T GetSingleById(ref List<T> items, Guid id)
{
// the Id is a property provided by HasId
return (from i in items where i.Id == id select i).SingleOrDefault();
}
}
然后添加另一种方法
...
public static IEnumerable<T> GetManyByParentId(ref List<T> items, Guid parentId) where T : HasIdAndParentId
{
// the parentId is a property of HasIdAndParentId which subclasses HasId
return from i in items where i.ParentId == parentId select i;
}
...
由于HasIdAndParentId子类HasId约束T:HasId已满足,但编译器不接受方法的where base类型约束。
有什么想法吗?
答案 0 :(得分:7)
在这种情况下,您没有在方法上重新定义类型参数,因此您无法应用任何新约束。你应该能够这样做:
public static IEnumerable<T2> GetManyByParentId<T2>(
ref List<T2> items, Guid parentId)
where T2 : T, HasIdAndParentId { .. }
答案 1 :(得分:1)
使GetManyByParentId
方法本身具有通用性,并将其通用参数绑定到T
:
public static IEnumerable<R> GetManyByParentId<R>(
ref List<R> items, Guid parentId)
where R : T, HasIdAndParentId
答案 2 :(得分:0)
Ben M的代码示例将不会编译,除非HasIdAndParentId是一个接口类型,它不是,由名称判断。
使第二个方法本身具有通用性,并根据其自己的类型参数(与T不同)进行制作将为您提供所需的约束。
public static IEnumerable<T1> GetManyByParentId<T1>(ref List<T1> items, Guid parentId) where T1 : HasIdAndParentId
{
// the parentId is a property of HasIdAndParentId which subclasses HasId
return from i in items where i.ParentId == parentId select i;
}