在表达式中使用泛型来获取重载的集合参数

时间:2018-07-12 10:57:20

标签: c# generics

我创建了一个类,该类的方法被重载以接受一个类或一个类的集合。

问题在于,对于不同类型的集合会调用错误的重载。使用我创建的以下示例代码可以看到一个示例:

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
}

输出将是:

Code output

因此只有IEnumerable会调用正确的Collection方法。

我会认为,通过将ICollection和IList作为IEnumerable的实现,它可能能够找出要调用的方法。还是C#中的泛型约束到某种程度,即使其他集合确实实现了IEnumerable却只允许使用指定的显式类呢?

在哪种情况下,我必须为每种集合类型编写一个重载?

0 个答案:

没有答案