第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

C#
精慕HU 2021-11-14 16:58:23
我有一些方法可以對(duì)數(shù)據(jù)庫執(zhí)行任意 SQL 并將該數(shù)據(jù)集合序列化為具體類型的列表。然后將該數(shù)據(jù)序列化為 JSON 并存儲(chǔ)在表格的單元格中。稍后,我需要返回并將該數(shù)據(jù)反序列化回其原始集合,以便可以使用它。我在弄清楚如何獲取Type對(duì)象并創(chuàng)建該類型的集合以對(duì)其進(jìn)行反序列化時(shí)遇到了一些問題。這是我的代碼的運(yùn)行方式: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;}現(xiàn)在,當(dāng)ExecuteWidget調(diào)用該方法時(shí),該type參數(shù)由小部件的 DTO 數(shù)據(jù)類型填充。例如HeadlineWidgetDTO。但是,執(zhí)行命令將數(shù)據(jù)作為L(zhǎng)ist<HeadlineWidgetDTO>. 當(dāng)我的FetchWidgetData方法被調(diào)用時(shí),dataType提供的仍然是HeadlineWidgetDTO,但它實(shí)際上需要是IEnumerable<HeadlineWidgetDTO>正確反序列化的類型。僅給定單個(gè)數(shù)據(jù)行的類型,如何創(chuàng)建一個(gè)Type對(duì)象而不是該類型的集合?
查看完整描述

1 回答

?
天涯盡頭無女友

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超9個(gè)贊

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


 var listType = typeof(List<>);

 var typeParams = new [] {theType};

 var listOfTType = listType.MakeGenericType(typeParams);

 var newListOfT = Activator.CreateInstance(listOfTType);

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


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


  var type = typeof(int);

  var dummy = Activator.CreateInstance(type);

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

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


查看完整回答
反對(duì) 回復(fù) 2021-11-14
  • 1 回答
  • 0 關(guān)注
  • 189 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)