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

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

C# 如何將對象轉換為運行時類型?

C# 如何將對象轉換為運行時類型?

C#
慕桂英3389331 2022-12-31 13:21:03
我如何將 an 轉換(或轉換,如果轉換不可能或不合理)object到它的運行時類型?我可以runtimeType使用反射,但不知道如何List<string>使用property.GetValue- 我知道我可以明確地做as List<String>,但這是一種軟代碼引擎,其中類型直到運行時才知道。任何幫助表示贊賞 - 謝謝?。ǖ垖ふ掖a解決方案,而不是“你不應該這樣做......”的答案)// 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貢獻1810條經驗 獲得超5個贊

長話短說


您不能將某些內容強制轉換為運行時指定的未知類型。這意味著在您的代碼中,您不知道對象的屬性或方法是什么,除非您使用更多的反射。在那種情況下,鑄造它的意義何在?


有時我們處理直到運行時才知道的類型。但是除非類型真的無關緊要,否則對象是無用的,除非我們可以將它轉換為代碼中指定的某種預定類型,而不是在運行時。


在這行代碼中:


var val = property.GetValue(obj); 

的聲明類型val由編譯器推斷。該類型是object因為這是GetValue返回的類型。對象的實際類型可以是string, int, List<Foo>, 等等。但是你有一個valtype的變量object。


如果你能這樣做:


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

那么編譯時類型val是什么?它怎么可能有任何值,因為它runTimeType是一個運行時值?除非您可以調用方法或檢查其屬性,否則該對象是無用的。但是你不能在不知道類型的情況下這樣做,除非你使用更多的反射。但是,如果您打算這樣做,那么施放它就沒有意義了。


在您發布的代碼下游的某處,您可能想要實際對涉及其方法或屬性的對象執行某些操作。這意味著知道您認為它是什么類型并將其轉換為該類型。那將是您的代碼中指定的類型,而不是在運行時確定的類型。


例如:


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

var myString = (string)val;

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

我認為它是一個string所以我把它作為一個string。(那里可能有額外的檢查。)現在我已經轉換了它,我有一個聲明為 type 的變量,string我可以將它用作字符串。(除非它不是string- 然后它會拋出運行時異常。)


這就是強制轉換的好處 - 它允許我們將某些內容分配給具有我們指定類型的強類型變量,然后相應地使用它。轉換為未知類型對我們沒有好處。


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


查看完整回答
反對 回復 2022-12-31
  • 1 回答
  • 0 關注
  • 152 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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