Я хотел создать метод расширения, который бы эффективно обертывал отдельные объекты как IEnumerables. Это было во избежание случаев, когда вы положили new [] {}
в середине выражения. Это достаточно легко сделать, используя следующий метод:Создание метода расширения для обертывания типов как IEnumerables
public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this TSource source)
{
return new[] { source };
}
Проблема заключается в том, что это будет применяться к любым типам (это ожидаемое поведение), но это также будет иметь побочный эффект: метод доступен по IEnumerable <T>
экземплярам. В случае, когда разрешенный расширенный тип является IEnumerable<T>
, я просто хотел бы вернуть этот IEnumerable, так как альтернатива находит себя с IEnumerable<IEnumerable<T>>
, что на самом деле не так, как вы ожидали при вызове метода.
Инстинктивно (и, возможно, сонно), я сначала создал перегрузку, которая выглядела как этот
public static IEnumerable<TSource> WrapAsEnumerable<TSource>(this IEnumerable<TSource> source)
{
return source;
}
для того, чтобы обрабатывать случай, когда тип завернуть является IEnumerable<T>
, Но, конечно, поток управления всегда разрешает первый метод.
Итак, вопрос в том, как я могу создать такой метод упаковки, который обрабатывает как случай, когда экземпляр расширенного параметра является IEnumerable<T>
, а когда нет?
Вызов метода не разрешен для первого метода. Он использует [перегрузочное разрешение] (https://msdn.microsoft.com/en-us/library/aa691336%28v=vs.71%29.aspx) во время компиляции. –
Что происходит с коллекциями, не относящимися к генерации, то есть 'IEnumerable'? – Romoku
Хотя они все еще могут быть повторены, я бы рассматривал их как отдельные экземпляры, которые могут и будут завернуты в IEnumerable. –