日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Dynamic动态类型

發(fā)布時(shí)間:2025/3/17 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dynamic动态类型 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是動(dòng)態(tài)類型

了解什么是動(dòng)態(tài)類型首先我們了解靜態(tài)類型,在我們平時(shí)定義一個(gè)int i=1就是靜態(tài)類型,靜態(tài)類型就是我們?cè)跊](méi)有編譯的時(shí)候已經(jīng)明確的知道他是一個(gè)int類型,動(dòng)態(tài)語(yǔ)言是我們?cè)谶\(yùn)行時(shí)才會(huì)知道的類型。所以我們?cè)诰帉?span style="color:#f33b45;">動(dòng)態(tài)類型的時(shí)候是無(wú)法使用vs的智能提示,因?yàn)榫幾g器也不知道他是一個(gè)什么類型。

dynamic i = 1; Console.WriteLine(i.GetType()); dynamic str = "1"; Console.WriteLine(str.GetType());

引用一張結(jié)構(gòu)圖

從圖中可以看出,DLR是建立在CLR的基礎(chǔ)之上的,其實(shí)動(dòng)態(tài)語(yǔ)言運(yùn)行時(shí)是動(dòng)態(tài)語(yǔ)言和C#編譯器用來(lái)動(dòng)態(tài)執(zhí)行代碼的庫(kù),它不具有JIT編譯,垃圾回收等功能。DLR通過(guò)它的綁定器(binder)和 調(diào)用點(diǎn)(callsite),元對(duì)象來(lái)把代碼轉(zhuǎn)換為表達(dá)式樹,然后再把表達(dá)式樹編譯為IL代碼,最后 由CLR編譯為本地代碼(DLR就是幫助C#編譯器來(lái)識(shí)別動(dòng)態(tài)類型)

dynamic和var區(qū)別

var關(guān)鍵字不過(guò)是一個(gè)指令,它告訴編譯器根據(jù)變量的初始化表達(dá)式來(lái) 推斷類型。(記住var并不是類型),而dynamic是類型,但是編譯時(shí)不屬于CLR 類型(指的int,string,bool,double等類型,運(yùn)行時(shí)肯定CLR類型中一種的),它是包含了 System.Dynamic.DynamicAttribute特性的System.Object類型,但與object又不一樣,不一樣主要體現(xiàn)在動(dòng)態(tài)類型不會(huì)在編譯時(shí)時(shí)執(zhí)行顯式轉(zhuǎn)換

使用動(dòng)態(tài)類型的優(yōu)點(diǎn)

1.減少?gòu)?qiáng)類型的轉(zhuǎn)換

2.延遲加載

3.調(diào)用C#類型中不存在的其他語(yǔ)言的類型

使用動(dòng)態(tài)類型的缺點(diǎn)

1.沒(méi)有智能提示

2.需要預(yù)先知道接收的數(shù)據(jù)結(jié)構(gòu)

動(dòng)態(tài)語(yǔ)言的約束

1不能用動(dòng)態(tài)類型作為擴(kuò)展方法的參數(shù)

2委托和動(dòng)態(tài)類型不能隱式轉(zhuǎn)換

3動(dòng)態(tài)類型不能調(diào)用構(gòu)造函數(shù)和靜態(tài)方法

4類型聲明和泛型類型參數(shù)

5類型聲明和泛型類型參數(shù)不能聲明一個(gè)基類為dynamic的類型,也不能將dynamic用于類型參數(shù)的約束,或作為類型 所實(shí)現(xiàn)的接口的一部分

實(shí)現(xiàn)動(dòng)態(tài)行為

我們實(shí)現(xiàn)動(dòng)態(tài)行為微軟給我們提供了三種方式,下面我們來(lái)試一試:

使用ExpandObject

static void Main(string[] args) {dynamic expand = new ExpandoObject();//動(dòng)態(tài)為expand類型綁定屬性expand.Name = "王麻子";expand.Age = 24;//動(dòng)態(tài)為expand類型綁定方法expand.AddMethod = (Func<int, string>)(x => $"你傳進(jìn)來(lái)的是{x}"); //調(diào)用expand類型的屬性和方法 Console.WriteLine($"姓名:{expand.Name}\n年齡:{expand.Age}\n綁定方法:{expand.AddMethod(666)}");Console.Read(); } 姓名:王麻子 年齡:24 綁定方法:你傳進(jìn)來(lái)的是666

?

使用DynamicObject

class DynamicType : DynamicObject {// 重寫方法, public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result){Console.WriteLine(binder.Name + "方法被調(diào)用");result = null;return true;}public override bool TrySetMember(SetMemberBinder binder, object value){Console.WriteLine(binder.Name + "屬性被設(shè)置," + "設(shè)置的值為:" + value);return true;} }class Program {static void Main(string[] args){dynamic dynamicobj = new DynamicType();dynamicobj.CallMethod();dynamicobj.Name = "王麻子";dynamicobj.Age = "24";Console.Read();} } CallMethod方法被調(diào)用 Name屬性被設(shè)置,設(shè)置的值為:王麻子 Age屬性被設(shè)置,設(shè)置的值為:24

?

實(shí)現(xiàn)IDynamicMetaObjectProvider接口

class Metadynamic : DynamicMetaObject {internal Metadynamic(Expression expression, DynamicType2 value) : base(expression, BindingRestrictions.Empty, value) { }//重寫響應(yīng)成員調(diào)用方法 public override DynamicMetaObject BindInvokeMember(InvokeMemberBinder binder, DynamicMetaObject[] args){//獲得真正的對(duì)象 DynamicType2 target = (DynamicType2)base.Value;Expression self = Expression.Convert(base.Expression, typeof(DynamicType2));var restrictions = BindingRestrictions.GetInstanceRestriction(self, target);//輸出綁定方法名 Console.WriteLine(binder.Name + "方法被調(diào)用了");return new DynamicMetaObject(self, restrictions);} } public class DynamicType2 : IDynamicMetaObjectProvider {public DynamicMetaObject GetMetaObject(Expression parameter){Console.WriteLine("開始獲得元數(shù)據(jù)......");return new Metadynamic(parameter, this);} }class Program {static void Main(string[] args){dynamic dynamicobj2 = new DynamicType2();dynamicobj2.Call();Console.Read();} } 開始獲得元數(shù)據(jù)...... Call方法被調(diào)用了

?

總結(jié)

以上是生活随笔為你收集整理的Dynamic动态类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。