Если все объекты наследуются от известного интерфейса, вы можете привести их, например,
var next = items.Cast<IHasNumber>.FirstOrDefault(x => x.Number == index + 1);
Если нет, вы можете использовать dynamic
, например,
var next = items.Cast<dynamic>.FirstOrDefault(x => x.Number == index + 1);
Если у вас есть контроль над типами, я бы заставил их реализовать интерфейс, чтобы вы могли использовать первый метод, который должен быть значительно быстрее второго. В этом случае ваша коллекция, вероятно, будет IEnumerable<IHasNumber>
для начала, и вам даже не придется разыгрывать.