Очевидно, я еще не совсем правильно понимаю, как использовать динамический тип, потому что он все еще просто возвращает объект.
Да, вы этого не понимаете. dynamic
- это не что иное, как объект с необычной шляпой на . Возвращаемый тип dynamic
означает «Я возвращаю object
, но вызывающие стороны должны разрешить операции с возвращаемым объектом, которые обычно не допускаются на object
, и эти операции будут разрешены во время выполнения».
Если это не совсем то, что вы имеете в виду, тогда не используйте dynamic
.
Я понимаю, почему он это делает - нет конструктора для списка, ожидающего перечисление объектов, когда список определен с аргументом типа.
Правильно. В вашем коде:
var values = Enumerable.Range( 1, 50 ).Select(
I => CreateFoo( typeof( Foo ) ) ).ToArray( );
values
- это dynamic[]
, что опять же просто object[]
в смешной шапке. Таким образом, вы вызываете конструктор List<Foo>
с object[]
, а не с IEnumerable<Foo>
, как требуется.
Каков правильный метод для того, что я пытаюсь сделать здесь?
Надлежащим является прекращение использования языка со статической типизацией для выполнения работы с динамической типизацией, но я подозреваю, что это будет не стартер.
У вас есть object[]
в руке. То, что вы хотите - это t[]
, где t
- это тип, предоставленный отражением. Решением проблемы с отражением почти всегда является использование большего количества отражений . Так сделай это. Не делайте этого:
var values = Enumerable.Range( 1, 50 ).Select(
I => CreateFoo( typeof( Foo ) ) ).ToArray( );
Это недостаточно использует отражение. Сделайте это:
object foos = Array.CreateInstance(typeof(Foo), 50);
Отлично. Теперь у вас есть Foo[50]
в руке, и вы можете снова заполнить его , используя отражение , или сделать его dynamic
и использовать динамическую среду выполнения для отправки индексации массива; Я полагаю, вы можете написать этот код. Если не можете, задайте другой вопрос.
Теперь у вас есть заполненный Foo[]
, равный IEnumerable<Foo>
, который вы затем можете передать конструктору List<Foo>
.
С какой стати вы это сделали - создайте Foo[]
, чтобы получить IEnumerable<Foo>
, чтобы получить List<Foo>
, который имеет то же содержимое, что и Foo[]
- я не знаю. Кажется, что слишком много шагов над гораздо более простым шагом - сделать List<Foo>()
без аргументов для конструктора и заполнить его напрямую! Но это вопрос, который вы задали, и на этот вопрос был дан ответ.
Это очень похоже на то, что мы называем «вопросом XY». У вас есть сумасшедшая идея о том, как решить вашу проблему, и вы спрашиваете о сумасшедшей идее, а не спрашиваете о проблеме, и поэтому сам ответ немного сумасшедший. В чем реальная проблема?