Хмм ..
Итак, если я вас правильно понял, вы знаете, что этот метод возвращает IQueryable<Item>
, где Item
- это тип, ранее сохраненный в _itemType
, и вы также знаете, что этот type всегда определяет RelatedItems
, которые, в свою очередь, являются IEnumerable<T>
или IQueryable<T>
с T
, определяющим ItemID
?
Есть ли тип, который все возможные _itemTypes
наследуют от того, который имеет RelatedItems
определены? Если это так, вы можете попробовать выполнить приведение к этому ...
В противном случае вы могли бы сделать больше Reflection magi c: Если вы знаете, что ваш результат - IQueryable<TItem>
, вы можете извлечь свойство-геттер для RelatedItems
с Reflection и передайте , что функции Select (которую вы можете получить путем преобразования в IQueryable<object>
или с помощью ... снова ... Reflection.
Но чтобы честно говоря, это был бы очень и очень грязный способ сделать это, и я бы сделал это только в крайнем случае.
Моим первым побуждением было бы попробовать рефакторинг содержащего класса (_itemType
намекает на мне, что это поле-член), поэтому оно также является generi c (наследуется от не-generi c класса, если вам это нужно), поэтому класс знает тип через свой собственный параметр типа.
Другое решение - иметь такую функцию:
private <Type of itemIDs> GetRelatedItemIds<TItem>(object source) {
return ((IQueriable<TItem>)source)?.Select(i => i.RelatedItems.Select(s => s.ItemID));
}
Теперь получите этот метод через Reflection и используйте на нем MakeGenericMethod(_itemType)
, затем вызовите его с вашим результатом.
Учтите, что ваш текущий выбор вернет ested enumerable / queryable, каждая запись которого является списком ItemID. Если вы не хотели этого делать, используйте SelectMany
вместо первого Select
, который автоматически объединит внутренние перечисления / запросы.
Надеюсь, это поможет вам найти решение.