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

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

C# 如何將對(duì)象轉(zhuǎn)換為運(yùn)行時(shí)類型?

C# 如何將對(duì)象轉(zhuǎn)換為運(yùn)行時(shí)類型?

C#
慕桂英3389331 2022-12-31 13:21:03
我如何將 an 轉(zhuǎn)換(或轉(zhuǎn)換,如果轉(zhuǎn)換不可能或不合理)object到它的運(yùn)行時(shí)類型?我可以runtimeType使用反射,但不知道如何List<string>使用property.GetValue- 我知道我可以明確地做as List<String>,但這是一種軟代碼引擎,其中類型直到運(yùn)行時(shí)才知道。任何幫助表示贊賞 - 謝謝?。ǖ?qǐng)尋找代碼解決方案,而不是“你不應(yīng)該這樣做......”的答案)// trimmed-down example classclass Bus { public List<string> Passengers {get;set;} }// create new instance of classvar obj = new Bus();// get property value using reflectionvar listPropertyName = "Passengers";var property = GetType(obj).GetProperty($"{listPropertyName}");var runtimeType = property.PropertyType;// returns object, but I want List<string> instead // (or whatever it is; could be different types like T, List<T>, etc.)var val = property.GetValue(obj);// doesn't work (assigns null), expects compile-time typevar val = property.GetValue(obj) as runtimeType; 
查看完整描述

1 回答

?
森欄

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

長(zhǎng)話短說


您不能將某些內(nèi)容強(qiáng)制轉(zhuǎn)換為運(yùn)行時(shí)指定的未知類型。這意味著在您的代碼中,您不知道對(duì)象的屬性或方法是什么,除非您使用更多的反射。在那種情況下,鑄造它的意義何在?


有時(shí)我們處理直到運(yùn)行時(shí)才知道的類型。但是除非類型真的無關(guān)緊要,否則對(duì)象是無用的,除非我們可以將它轉(zhuǎn)換為代碼中指定的某種預(yù)定類型,而不是在運(yùn)行時(shí)。


在這行代碼中:


var val = property.GetValue(obj); 

的聲明類型val由編譯器推斷。該類型是object因?yàn)檫@是GetValue返回的類型。對(duì)象的實(shí)際類型可以是string, int, List<Foo>, 等等。但是你有一個(gè)valtype的變量object。


如果你能這樣做:


var val = property.GetValue(obj) as runtimeType;    

那么編譯時(shí)類型val是什么?它怎么可能有任何值,因?yàn)樗黵unTimeType是一個(gè)運(yùn)行時(shí)值?除非您可以調(diào)用方法或檢查其屬性,否則該對(duì)象是無用的。但是你不能在不知道類型的情況下這樣做,除非你使用更多的反射。但是,如果您打算這樣做,那么施放它就沒有意義了。


在您發(fā)布的代碼下游的某處,您可能想要實(shí)際對(duì)涉及其方法或?qū)傩缘膶?duì)象執(zhí)行某些操作。這意味著知道您認(rèn)為它是什么類型并將其轉(zhuǎn)換為該類型。那將是您的代碼中指定的類型,而不是在運(yùn)行時(shí)確定的類型。


例如:


var val = property.GetValue(obj); // I know this is a string

var myString = (string)val;

var findX = myString.IndexOf("X");

我認(rèn)為它是一個(gè)string所以我把它作為一個(gè)string。(那里可能有額外的檢查。)現(xiàn)在我已經(jīng)轉(zhuǎn)換了它,我有一個(gè)聲明為 type 的變量,string我可以將它用作字符串。(除非它不是string- 然后它會(huì)拋出運(yùn)行時(shí)異常。)


這就是強(qiáng)制轉(zhuǎn)換的好處 - 它允許我們將某些內(nèi)容分配給具有我們指定類型的強(qiáng)類型變量,然后相應(yīng)地使用它。轉(zhuǎn)換為未知類型對(duì)我們沒有好處。


冒著增加混亂的風(fēng)險(xiǎn):有人可能會(huì)說泛型表示運(yùn)行時(shí)未指定的類型,但事實(shí)并非如此。List<T>沒有指定是什么T,但是如果您List<T>以某種方式在某處創(chuàng)建一個(gè) ,您將在代碼中指定類型。在絕大多數(shù)正常場(chǎng)景中,我們必須知道一些關(guān)于對(duì)象類型的信息,否則該對(duì)象對(duì)我們來說是無用的。


查看完整回答
反對(duì) 回復(fù) 2022-12-31
  • 1 回答
  • 0 關(guān)注
  • 161 瀏覽

添加回答

舉報(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)