У меня есть общий функционал, который берет строку полей и выбирает их из объекта с помощью 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));