Вызов метода расширения из динамического списка - PullRequest
0 голосов
/ 20 февраля 2019

Я создаю тип, используя отражение ...

Type type = Type.GetType("Book");

Затем я вызываю метод динамически ...

MethodInfo method = typeof(DataHelper).GetMethod("GetTableData");
MethodInfo generic = method.MakeGenericMethod(type);
var parameters = new object[] {...};
dynamic data = generic.Invoke(this, parameters);

Метод возвращает данные и выглядит следующим образом...

public static IEnumerable<T> GetTableData<T>(parameters)
{
...
}

Из динамических данных я хочу преобразовать это в список и вызвать метод расширения для преобразования списка в DataTable.

Я пробовал следующее,что не удается при вызове .ToDataTable:

var x = Enumerable.ToList(data);
x.ToDataTable().BulkCopyDataTable(settings, booName);

Я также попытался:

var tl = GetTypedList(type);
            foreach (var d in x)
            {
                tl.Add(d);
            }

var y = tl.ToDataTable(); // compilaer error.

private static IList GetTypedList(Type t)
        {
            var listType = typeof(List<>);
            var constructedListType = listType.MakeGenericType(t);
            var instance = Activator.CreateInstance(constructedListType);
            return (IList) instance;
        }

Метод расширения, который я пытаюсь вызвать:

public static DataTable ToDataTable<T>(this IList<T> data)
        {
            var properties = TypeDescriptor.GetProperties(typeof(T));
            var table = new DataTable();
            foreach (PropertyDescriptor prop in properties)
                table.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);

            foreach (var item in data)
            {
                var row = table.NewRow();
                foreach (PropertyDescriptor prop in properties)
                    row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
                table.Rows.Add(row);
            }


            return table;
        }

Любые указатели на то, где это идет не так?

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