Ваша проблема в том, что вы не добавляете каждый элемент в список, вы добавляете свойство каждого элемента.Это свойство будет доступно только для Structure
, и не для любого другого типа, с которым вы можете повторно использовать код.
У вас также нет механизма для получения дочерних элементов ваших других классов.(свойство r.Children
, которое вы используете).
Двумя вашими решениями будет использование интерфейсов (то есть определите IHasChildren
и IGetProperty
), которые могут использоваться в качестве базовых типов для простого алгоритма, илиВы можете передать в свой метод функции, которые позволяют более свободно вычислять это.Например, подпись вашего метода может быть такой:
public static IEnumerable<TPropertyType> GetPropertyValues<TType, TPropertyType>
(this IEnumerable<TType> rootItem, Func<TType, IEnumerable<TType>> getChildren, Func<TType, TPropertyType> getIdValue)
... но это не будет очень красиво!