动态传递通用对象

时间:2018-04-20 21:59:11

标签: asp.net-core http-get generic-list

我正在尝试动态显示一个表,具体取决于tableName用户从下拉列表中选择的内容。我从我的Web控制器(.Net Core)传递一个json对象,所以为了做到这一点,我首先使用函数将我的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;
        }
    }

并在我的获取请求中调用此函数

    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

1 个答案:

答案 0 :(得分:0)

使用反射,您可以调用通用扩展方法:

Type genericType = Type.GetType("YourNamespace.ConverterClass");
MethodInfo methodInfo = typeof(ConverterClass).GetMethod("ConvertTableToList", BindingFlags.Public | BindingFlags.Static).MakeGenericMethod(genericType);
var TableDetailsInList = methodInfo.Invoke(null, new object[]{ TableDetails });