我创建了一个类,该类的方法被重载以接受一个类或一个类的集合。
问题在于,对于不同类型的集合会调用错误的重载。使用我创建的以下示例代码可以看到一个示例:
void Main()
{
GenericMethod(x => x.CollectionItems, ExpectedType.Collection);
GenericMethod(x => x.ListItems, ExpectedType.Collection);
GenericMethod(x => x.EnumerableItems, ExpectedType.Collection);
GenericMethod(x => x.CollectionTestSubClass, ExpectedType.Single);
}
public void GenericMethod<TPropType>(Expression<Func<CollectionTestClass, TPropType>> predicate, ExpectedType expectedType)
where TPropType : class
{
$"Single Method Called - Expected: {expectedType}".Dump();
}
public void GenericMethod<TPropType>(Expression<Func<CollectionTestClass, IEnumerable<TPropType>>> predicate, ExpectedType expectedType)
where TPropType : class
{
$"Collection Method Called - Expected: {expectedType}".Dump();
}
public class CollectionTestClass
{
public Guid Id { get; set; }
public ICollection<CollectionTestSubClass> CollectionItems { get; set; }
public IList<CollectionTestSubClass> ListItems { get; set; }
public IEnumerable<CollectionTestSubClass> EnumerableItems { get; set; }
public CollectionTestSubClass CollectionTestSubClass { get; set; }
}
public class CollectionTestSubClass
{
public Guid Id { get; set; }
}
public enum ExpectedType
{
Single,
Collection
}
输出将是:
因此只有IEnumerable会调用正确的Collection
方法。
我会认为,通过将ICollection和IList作为IEnumerable的实现,它可能能够找出要调用的方法。还是C#中的泛型约束到某种程度,即使其他集合确实实现了IEnumerable
却只允许使用指定的显式类呢?
在哪种情况下,我必须为每种集合类型编写一个重载?