亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C# 隱藏類型到相同類型的 IEnumerable 中?

C# 隱藏類型到相同類型的 IEnumerable 中?

C#
精慕HU 2021-11-14 16:58:23
我有一些方法可以對數據庫執行任意 SQL 并將該數據集合序列化為具體類型的列表。然后將該數據序列化為 JSON 并存儲在表格的單元格中。稍后,我需要返回并將該數據反序列化回其原始集合,以便可以使用它。我在弄清楚如何獲取Type對象并創建該類型的集合以對其進行反序列化時遇到了一些問題。這是我的代碼的運行方式: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();}我的獲取邏輯如下所示:public object FetchWidgetData(Guid runGuid, string widgetName, Type dataType){    var data = operationsContext.ReportRuns        .Include("ReportRunWidgetDatas")        .FirstOrDefault(n => n.RunGuid == runGuid)?        .ReportRunWidgetDatas.FirstOrDefault(n => n.WidgetName == widgetName)?        .WidgetData;    if (data == null) return null;    var deserialized = new JavaScriptSerializer().Deserialize(data, dataType);    return deserialized;}現在,當ExecuteWidget調用該方法時,該type參數由小部件的 DTO 數據類型填充。例如HeadlineWidgetDTO。但是,執行命令將數據作為List<HeadlineWidgetDTO>. 當我的FetchWidgetData方法被調用時,dataType提供的仍然是HeadlineWidgetDTO,但它實際上需要是IEnumerable<HeadlineWidgetDTO>正確反序列化的類型。僅給定單個數據行的類型,如何創建一個Type對象而不是該類型的集合?
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻1831條經驗 獲得超9個贊

基本上,如果您有一個類型 object Type theType,則需要執行以下操作:


 var listType = typeof(List<>);

 var typeParams = new [] {theType};

 var listOfTType = listType.MakeGenericType(typeParams);

 var newListOfT = Activator.CreateInstance(listOfTType);

此時,您有一個 type 變量object,但它引用了一個 type 對象List<WhateverYourTypeIs>。說,theTypeis typeof(int),那么你將有一個 的對象List<int>。不過,將它轉換為可用的東西是另一個問題。如果你想在這個列表中添加一些東西,我懷疑最好的方法是MethodInfo為Add方法和Invoke它獲取一個。


如果類型具有默認構造函數并且創建起來不太昂貴,我想到了另一種方法來做到這一點。這是一個示例(創建一個List<int>- 但這只是我編碼的方式):


  var type = typeof(int);

  var dummy = Activator.CreateInstance(type);

  var listOfType = new[] {dummy}.ToList();

完成后,listOfType變量的類型為 aList<object>但指的是 a List<int>。它主要是可行的 - 例如,您可以調用Add(object someObj)它。你不會得到編譯類型參數類型檢查,但你可以使用它。


查看完整回答
反對 回復 2021-11-14
  • 1 回答
  • 0 關注
  • 184 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號