C# dynamic 类型用法举例
? ? ?dynamic類型允許編寫忽略編譯期間的類型檢查的代碼。編譯器假定,給dynamic類型的對象定義的任操作都是有效的。如果該操作無效,則在代碼運行之前不會檢測該錯誤,如下面的示例所示:
這個示例沒有編譯,因為它調用了staticPerson.GetFullName方法。因為Person 對象上的方法不接受兩個參數,所以編譯器會提示出錯。如果注釋掉該行代碼,這個示例就會編譯。如果執行它,就會發生一個運行錯誤。所拋出的異常是RuntimeBinderException 異常。RuntimeBinder對象會在運行時判斷該調用,確定Person類是否支持被調用的方法。
? ? ? 與 var 關鍵字不同,定義為dynamic的對象可以在運行期間改變其類型。注意在使用var關鍵字時,對象類型的確定會證遲。類型一旦確定,就不能改變。動態對象的類型可以改變,而且可以改變影次,這不同于把對象的類型事轉換為另一種類型。在強制轉換對象的類型時,是用另一種兼容的類聚們建一個新對象。如,不能把int強制轉換為Penon對象。在下面的示例中,如果對象是動態對象,就可以把它從int變成Persor類型:
static void Main(string[] args){//var staticperson = new Person();//dynamic dynamicPerson = new Person();//staticperson.GetFullName("John", "Smith");//dynamicPerson.GetFullName("Jchn", "Smith");dynamic dyn;dyn = 100;Console.WriteLine(dyn.GetType());Console.WriteLine(dyn);dyn = "This is a string";Console.WriteLine(dyn.GetType());Console.WriteLine(dyn);dyn = new Person() { FirstName = "Bugs", LastName = "Bunny" };Console.WriteLine(dyn.GetType());Console.WriteLine($"{dyn.FirstName} {dyn.LastName}");Console.ReadKey();}執行這段代碼可以看出,dyn對象的類型實際上從System.Int32變成System.String.再變成Person。如果 dyn聲明為int 或string,這段代碼就不會編譯。
注意:對于dynamic 類型有兩個限制。動態對象不支持擴展方法,匿名函數(lambda表達式)也不能用作動態方法調用的參數,因此LINQ不能用于動態對象,大多數LINQ調用大都是擴展方法,而lambda表達式用作這些擴展方法的參數.
技術群:添加小編微信并備注進群
小編微信:mm1552923 ??
公眾號:dotNet編程大全? ? ??
總結
以上是生活随笔為你收集整理的C# dynamic 类型用法举例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .NET 运行时设置
- 下一篇: C#10 和 .NET6 代码跨平台开发