Member 13790577 Ответов: 1

Динамическая передача универсального объекта


Я пытаюсь динамически отображать таблицу в зависимости от того, какое имя таблицы пользователь выбрал из выпадающего списка. Я передаю объект json из моего веб-контроллера(.Net Core), поэтому для этого я сначала преобразую свой dataTable в список объектов с помощью функции
public static List<T> ConvertTableToList<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(Exception ex)
                    {
                        throw ex;
                    }
                }

                list.Add(obj);
            }

            return list;
        }
        catch
        {
            return null;
        }
    }

и вызовите эту функцию в моем запросе Get
public IActionResult GetTableDetailsByTableName(string TableNameSelected)
{
    //To get the data for the Table Selected
    DataTable TableDetails = ReferenceTableLogics.getTableDetails(TableNameSelected);

    var TableDetailsInList = ConverterClass.ConvertTableToList<CSBM_AGE_BAND>(TableDetails);
    return Ok(TableDetailsInList);
}

Теперь проблема заключается в том, что мне нужно сообщить свое имя класса (например, CSBM_AGE_BAND в данном случае) в зависимости от того, что пользователь выбрал в выпадающем списке (TableNameSelected).

Есть ли какой-нибудь способ, с помощью которого я могу динамически передать это имя класса моей функции ConvertTableToList() ?

Что я уже пробовал:

Я попытался сделать это путем размышления, но это не очень помогло.

Я также хотел бы знать, существует ли в .net core какая-либо функция, которая может напрямую конвертировать dataset в объект json (попробовал JsonConvert.SerializeObject, но не смог получить доступ к нему с помощью typescript). Вот как я получаю информацию на стороне клиента.

getTableColumnDetailsByTableName(TableName: string): void {
        this.coverMeService.getTableColumnDetailsByTableName(TableName)
            .subscribe(data => { this.TableColumnDetails = data; } );
    }

1 Ответов

Рейтинг:
1

Richard Deeming

Используйте нестандартный метод для преобразования DataTable:

public static List<object> ConvertTableToList(this DataTable table, Type itemType)
{
    List<object> result = new List<object>();
    
    foreach (var row in table.AsEnumerable())
    {
        object item = Activator.CreateInstance(itemType);
        
        foreach (var prop in itemType.GetProperties())
        {
            prop.SetValue(item, Convert.ChangeType(row[prop.Name], prop.PropertyType), null);
        }
        
        result.Add(item);
    }
    
    return result;
}
Использование:
Type itemType = GetItemTypeFromTableName(TableNameSelected);
List<object> TableDetailsInList = ConverterClass.ConvertTableToList(TableDetails, itemType);

Теперь вам просто нужно решить, как сопоставить имя таблицы с типом элемента. Например:
private static readonly IReadOnlyDictionary<string, Type> ItemTypeMap = new Dictionary<string, Type>
{
    ["CSBM_AGE_BAND"] = typeof(CSBM_AGE_BAND),
    ...
};

private static Type GetItemTypeFromTableName(string tableName) => ItemTypeMap[tableName];