C#将类型转换为相同类型的IEnumerable?
我有一些方法可以对数据库执行任意SQL,并将数据收集序列化为具体类型的列表。然后将该数据序列化为JSON并存储在表中的单元格中。稍后,我需要返回并将该数据反序列化回其原始集合,以便可以使用它 我在弄清楚如何获取C#将类型转换为相同类型的IEnumerable?,c#,entity-framework,reflection,C#,Entity Framework,Reflection,我有一些方法可以对数据库执行任意SQL,并将数据收集序列化为具体类型的列表。然后将该数据序列化为JSON并存储在表中的单元格中。稍后,我需要返回并将该数据反序列化回其原始集合,以便可以使用它 我在弄清楚如何获取类型对象并创建该类型的集合以便对其进行反序列化时遇到了一些问题。下面是我的代码的操作方式: public async Task ExecuteWidget(Guid runGuid, string widgetName, Type type, string sql, IEnumer
类型
对象并创建该类型的集合以便对其进行反序列化时遇到了一些问题。下面是我的代码的操作方式:
public async Task ExecuteWidget(Guid runGuid, string widgetName, Type type, string sql,
IEnumerable<SqlParameter> parameters)
{
var report = operationsContext.ReportRuns.FirstOrDefault(n => n.RunGuid == runGuid);
CheckReportStatus(report);
var param = parameters.ToList();
var result = edwContext.Database.SqlQuery(type, sql, param.ToArray<object>());
var query = result.GetQuery(param);
var data = await result.ToListAsync();
var widgetData = new ReportRunWidgetData()
{
ReportRunId = report?.ReportRunId ?? -1, // This should never be null.
WidgetName = widgetName,
WidgetData = new JavaScriptSerializer().Serialize(data),
Query = query
};
operationsContext.ReportRunWidgetDatas.Add(widgetData);
await operationsContext.SaveChangesAsync();
}
现在,当调用ExecuteWidget
方法时,type
参数由小部件的DTO数据类型填充。例如HeadlineWidgetDTO
。但是,execute命令以列表的形式返回数据。调用myFetchWidgetData
方法时,提供的dataType
仍然是HeadlineWidgetDTO
,但它实际上需要是IEnumerable
类型才能正确反序列化
给定单个数据行的类型,如何创建一个type
对象,而不是该类型的集合?这大部分是的副本,但很难说
基本上,如果您有一个type对象键入type
,则需要执行以下操作:
var listType = typeof(List<>);
var typeParams = new [] {theType};
var listOfTType = listType.MakeGenericType(typeParams);
var newListOfT = Activator.CreateInstance(listOfTType);
完成后,listOfType
变量被键入为列表
,但引用的是列表
。它基本上是可行的——例如,您可以对其调用Add(objectsomeobj)
。您将不会得到编译类型参数类型检查,但您将能够使用它。FYIList
反序列化在Json.NET中受支持,这是您应该使用的。微软告诉你使用Json.NET进行序列化/deserializing@maccettura这仍然没有解决如何从headlinewidgetdt的类型
到IEnumerable
的问题。我不相信Json.Net会帮我解决这个问题。这就是你所说的:?您可以使用Type.MakeGenericType
和Activator.CreateInstance
从T
@Flydog57创建列表。如果你想把它写成一个答案,我会继续做标记。同样,在EF Core中,你可以将JSON序列化程序嵌入到值转换中
var listType = typeof(List<>);
var typeParams = new [] {theType};
var listOfTType = listType.MakeGenericType(typeParams);
var newListOfT = Activator.CreateInstance(listOfTType);
var type = typeof(int);
var dummy = Activator.CreateInstance(type);
var listOfType = new[] {dummy}.ToList();