Конвертировать IEnumerable в IEnumerable <T>, если T не известен до времени выполнения - PullRequest
4 голосов
/ 18 августа 2011

Как я могу преобразовать IEnumerable в IEnumerable<T>, если T не известен до времени выполнения?

У меня есть метод, которому абсолютно необходим IEnumerable<T>, где T неизвестно до тех пор, пока время выполнения и T не должно быть фактическим типом, а не типом предка, подобным объекту .

Бьюсь об заклад, API отражения допускает нечто подобное, но я точно не знаю, как.

Обновление

Я могу получить объект типа, подобный этому:

var first = results.Cast<object>().FirstOrDefault();
if (first != null)
{
    var type = first.GetType();

}

Update2

"Метод", на который я ссылался, на самом деле был установщиком свойства ItemSrid WPF DataGrid. У меня проблема в том, что если я не передам IEnumerable<T>, строки, сгенерированные в Datagrid, будут пустыми, как если бы он не отражал свойства T и не может генерировать столбцы.

Даже использование этого кода имеет такой нежелательный эффект:

    public CollectionResultWindow(IEnumerable results)
    {
        Contract.Requires(results != null, "results is null.");

        InitializeComponent();
        DataContext = this;

        var first = results.Cast<object>().FirstOrDefault();
        if (first != null)
        {
            Type type = first.GetType();
            var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(type);
            dynamic genericResults = castMethod.Invoke(null, new[] { results });
            Results = genericResults; // Results is a dependency property that DataGrid.ItemSource is bound to.
        }

    }

Ответы [ 2 ]

7 голосов
/ 18 августа 2011
var elementType = ...
var results = ...
var castMethod = typeof(Enumerable).GetMethod("Cast").MakeGenericMethod(elementType);
var genericResults = castMethod.Invoke(null, new[] { results });

Переменная genericResults относится к объекту типа IEnumerable<T> (где T - это тип, представленный переменной elementType). Но имейте в виду, что статически genericResults все еще имеет тип object; нет никакого способа сказать компилятору, что это IEnumerable<T>, так как T статически неизвестен.

0 голосов
/ 18 августа 2011

Вот код, который работал для меня:

    public CollectionResultWindow(IEnumerable results)
    {
        Contract.Requires(results != null, "results is null.");

        InitializeComponent();
        DataContext = this;

        var first = results.Cast<object>().FirstOrDefault();
        if (first != null)
        {
            Type type = first.GetType();
            var castMethod = typeof(Enumerable).GetMethod("ToList").MakeGenericMethod(type);
            dynamic genericResults = castMethod.Invoke(null, new[] { results });
            Results = genericResults; // Results is a dependency property that DataGrid.ItemSource is bound to.
        }

    }        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...