Преобразование DataTable в динамически созданную модель сущностей? - PullRequest
0 голосов
/ 14 декабря 2018

Я создал экземпляр модели сущности под названием MyModel, но мне нужно использовать этот экземпляр в качестве типа в моем классе помощника, чтобы я мог преобразовать данные в любую модель, которая была динамически создана.Все работает, если я явно передаю фактическую модель классу помощника, например:

var data = Helper.DataTableToList<MyActualEntity>(datatable);

, но мне нужно сделать это динамически.Это мой вспомогательный класс

 public static class Helper
    {
        /// <summary>
        /// Converts a DataTable to a list with generic objects
        /// </summary>
        /// <typeparam name="T">Generic object</typeparam>
        /// <param name="table">DataTable</param>
        /// <returns>List with generic objects</returns>
        public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
        {
            try
            {
                List<T> list = new List<T>();

                foreach (var row in table.AsEnumerable())
                {
                    T obj = new T();

                    foreach (var prop in obj.GetType().GetProperties())
                    {
                        try
                        {
                            PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                            propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                        }
                        catch
                        {
                            continue;
                        }
                    }

                    list.Add(obj);
                }

                return list;
            }
            catch
            {
                return null;
            }
        }
    }

Это я создаю сущность динамически по имени таблицы.Он работает нормально, пока мне не нужно передать тип в класс Helper, и я получаю ошибку «MyModel - переменная, но используется как тип»

var assembly = AppDomain.CurrentDomain.GetAssemblies()
    .Where(x => x.FullName.Contains("MyNameSpace.Model")).FirstOrDefault();
var type = assembly.GetTypes()
    .FirstOrDefault(t => t.Name == tableName);

if (type != null)
{
    System.Data.Entity.DbSet myDbSet = ctx.Set(type);                       
   var MyModel = myDbSet.Create(); <--Entity is created

    var data = Helper.DataTableToList<MyModel>(dt);  <--Errors here                           
}

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018
System.Reflection.MethodInfo MI = typeof(Helper).GetMethod("DataTableToList");   
System.Reflection.MethodInfo generic = MI.MakeGenericMethod(MyModel.GetType());    
var data = generic.Invoke(null, new object[] { //YourDataTableHere });

Вы должны использовать отражение как @dbc, указанное выше.Затем вы должны вызвать универсальный метод и привести новый объект к вашим данным.Если вы не используете статические методы, измените аргументы

0 голосов
/ 14 декабря 2018

В соответствии с вашим описанием, вспомогательный метод является методом расширения в DataTable, поэтому вы должны использовать следующую строку кода:

var data = dt.DataTableToList<MyModel>();

вы можете использовать тот же код для любого типа модели, так как это общий метод.Пример кода я выполнил в конце.Расширение класса помощника:

public static List<T> DataTableToList<T>(this DataTable table) where T : class, new()
        {
            try
            {
                List<T> list = new List<T>();

                foreach (DataRow row in table.Rows)
                {
                    T obj = new T();
//change made at this line
                    foreach (var prop in obj.GetType().GetProperties())
                    {
                        try
                        {
                            PropertyInfo propertyInfo = obj.GetType().GetProperty(prop.Name);
                            propertyInfo.SetValue(obj, Convert.ChangeType(row[prop.Name], propertyInfo.PropertyType), null);
                        }
                        catch
                        {
                            continue;
                        }
                    }

                    list.Add(obj);
                }

                return list;
            }
            catch
            {
                return null;
            }
        }

Класс модели:

 public class Data
        {
            public string Client_Description { get; set; }
            public string Client_Code { get; set; }
            public string Brand_Description { get; set; }
            public string Brand_Code { get; set; }
        }

Метод вызова:

DataTable inputData = null; // Get the DataTable

Метод расширения вызова:

var dataList = inputData.DataTableToList<Helper.Data>();

Или

var data = Helper.DataTableToList<Helper.Data>(inputData);

Пожалуйста, поделитесь со мной своим исходным кодом, если у вас все еще есть проблемы.

enter image description here

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