提问人:Manib 提问时间:5/3/2023 最后编辑:Manib 更新时间:5/4/2023 访问量:182
将 List<object> 转换为 List<model> 仅使用模型名称 C# MVC 键入
Convert List<object> to List<model> type with only the model name c# mvc
问:
所以我正在尝试创建一个泛型函数(目前不是,但我想在未来证明它,所以在以后的阶段可以选择/传递 tableName)。
我想使用字符串来获取模型并使变量为类型,但我一直在获取类型。Customers_Model
c
Customers_Model
object
我知道你可以做到:但这假设你知道该模型类型,但我只从字符串中获取了模型类型。我觉得好像与变量有关,因为它包含模型名称,但不能完全理解它。(Customers_Model)Activator.CreateInstance(type)
type
我也看到过这一点,但它假设您知道要在模型中访问的函数。在这种情况下,我们不知道其中的任何函数/字段来使用此解决方案,只有 .modelName
public async Task<ActionResult> Index()
{
var tableName = "Customers";
string modelName = "MVC.Models." + tableName + "_Model";
Type type = Type.GetType(modelName);
var d = Activator.CreateInstance(type);
var c = Convert.ChangeType(d, type);
var data = await DBServices.GetFromTable(tableName, c);
if (data.Count > 0)
{
return View(data);
}
else
return View();
}
编辑 1
我希望用户选择一个表,然后让它在视图中显示该表。My View 接受模型GeneralViewModel
GeneralViewModel:
public class GeneralViewModel
{
public List<Customers_Model> Customers {get; set;}
}
在稍后的阶段,我希望能够添加更多模型,而不必更改控制器/视图,因为它已经泛化了。
我是否应该转换为一个,当它显示在视图中时,然后只查找计数> 0 的第一个列表并将其显示?我只希望一次填充一个列表。c
GeneralViewModel
GeneralViewModel
编辑 2
这是我的 DBServices 中的几个函数,因为发送的 T 类型是 object(由于上面的 var c),那么返回类型也是 object。如果我能整理出传入的类型,那么这一切都将得到解决。
public static async Task<List<T>> GetFromTable<T>(string tableName, T type)
{
var results = new List<T>();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string cmdText = "SELECT * FROM " + tableName + ";";
SqlCommand cmd = new SqlCommand(cmdText, conn);
try
{
conn.Open();
SqlDataReader reader = await cmd.ExecuteReaderAsync();
while (reader.Read())
{
if (reader != null)
{
results.Add(ConvertReader((IDataReader)reader, type));
}
}
reader.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
return results;
}
public static T ConvertReader<T>(IDataReader reader, T value)
{
//var item = value;
var typeProperties = value.GetType().GetProperties();
foreach (var property in typeProperties)
{
DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(property, typeof(DisplayNameAttribute));
int ordinal;
if (attr != null)
{
ordinal = reader.GetOrdinal(attr.DisplayName);
}
else
{
ordinal = reader.GetOrdinal(property.Name);
}
if (!reader.IsDBNull(ordinal))
{
property.SetValue(value, reader[ordinal], null);
}
}
return value;
}
答:
您是否尝试过模式匹配?
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace StackOverflow
{
internal class Program
{
static void Main(string[] args)
{
List<int> a = GetList(10, 10);
List<double> b = GetList(10, 100.0);
List<ModelTest> c = GetList(10, new ModelTest());
}
private static List<T> GetList<T>(int numberOfElements, T value)
{
Type type = typeof(T);
var actualInstance = Activator.CreateInstance(type);
actualInstance = value;
var list = new List<T>();
for (int i = 0; i < numberOfElements; i++)
{
if (actualInstance is T t)
{
list.Add(t);
}
}
return list;
}
}
internal class ModelTest
{
public ModelTest()
{
}
}
}
这编译并返回预期的结果,这是一个简单的示例,还有一些东西需要添加,如果类型不包含无参数构造函数,它会带来异常,当然你可以避免改进方法。T
GetList()
这是你需要的吗?,我在这里错过了什么吗?
问候
米格尔·:)
我最终只是创建了一个用于将字符串转换为模型类型的工具。然后,我将其作为第二个参数传递到函数中。然后它返回了正确的结果。Dictionary<string, dynamic>
GetFromTable
上一个:无法投射到对象
下一个:如何将对象强制转换为匿名 T
评论
Convert.ChangeType
在这里是无用的,因为它返回一个 ,就像一样。但是,即使您设法将数据转换为强类型列表,您如何将其传递给正确的方法呢?请注意,泛型类型始终在编译时解析。它们在动态场景中根本没有帮助。只需针对非泛型接口即可。object
Activator.CreateInstance
IList
Type.GetType
object