Как вернуть новый объект, созданный linq, в универсальной функции - PullRequest
0 голосов
/ 11 июля 2019

У меня есть общий функционал, который берет строку полей и выбирает их из объекта с помощью linq. Однако вывод не тип объекта, а подмножество. Поэтому, чтобы преобразовать этот новый List<subsetOfOriginal> в DataTable, я не могу использовать list.GetType(), потому что он получит меня Оригинал.

Я преобразовал

Func<T, T> CreateSelectStatement<T>(string fields)

до

Func<T, S> CreateSelectStatement<T, S>(string fields)

потому что я не хочу, чтобы TResult был типа T. Не уверен, что это правильный путь. Это код, который у меня есть на данный момент и как он вызывается.

Func<T, S> CreateSelectStatement<T, S>(string fields)
    {
        var xParameter = Expression.Parameter(typeof(T), "o");
        var xNew = Expression.New(typeof(T));
        var bindings = fields.Split(',').Select(o => o.Trim())
            .Select(o => {
        var mi = typeof(T).GetProperty(o);
        var xOriginal = Expression.Property(xParameter, mi);
        return Expression.Bind(mi, xOriginal);
            }
        );

        var xInit = Expression.MemberInit(xNew, bindings);
        var lambda = Expression.Lambda<Func<T, S>>(xInit, xParameter);
        return lambda.Compile();
    }

и затем, чтобы вызвать его, я использую

CreateSelectStatement<SP_ProjectAnalysis_NP, dynamic>(columns)

Ожидаемым результатом должны быть поля, которые загружаются правильно, но тип объекта такой, как если бы я использовал p => new { }. В настоящее время я получаю объект в качестве возвращаемого типа и при попытке выполнить следующее возвращает мне 0 свойств:

private static DataTable ToDataTable<T>(IList<T> list, string tableName = "table")
        {
            PropertyDescriptorCollection props = TypeDescriptor.GetProperties(typeof(T));
...