Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#将类型转换为相同类型的IEnumerable?_C#_Entity Framework_Reflection - Fatal编程技术网

C#将类型转换为相同类型的IEnumerable?

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

我有一些方法可以对数据库执行任意SQL,并将数据收集序列化为具体类型的列表。然后将该数据序列化为JSON并存储在表中的单元格中。稍后,我需要返回并将该数据反序列化回其原始集合,以便可以使用它

我在弄清楚如何获取
类型
对象并创建该类型的集合以便对其进行反序列化时遇到了一些问题。下面是我的代码的操作方式:

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命令以
列表的形式返回数据。调用my
FetchWidgetData
方法时,提供的
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)
。您将不会得到编译类型参数类型检查,但您将能够使用它。

FYI
List
反序列化在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();