c# 中怎么實(shí)現(xiàn)表達(dá)式樹(shù)實(shí)驗(yàn),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
10多年專注成都網(wǎng)站制作,成都定制網(wǎng)站,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁(yè)制作,對(duì)VR全景等多個(gè)行業(yè),擁有豐富的營(yíng)銷推廣經(jīng)驗(yàn)。
Func
Expression
Console.WriteLine(myfunc(3, 4));
//Console.WriteLine(expression(5, 6));//expression是變量,但此處當(dāng)作方法
//上面分別表示Func委托和表達(dá)式樹(shù),看上去很相似。對(duì)于委托我們能控制執(zhí)行,但內(nèi)部代碼在程序運(yùn)行中是無(wú)法得知的,而表達(dá)式樹(shù)剛好相反,表達(dá)式樹(shù)是一種數(shù)據(jù)結(jié)構(gòu),可以獲取內(nèi)部細(xì)節(jié)。
//上面xpression中是使用Lambda為表達(dá)式樹(shù)賦值,還可以:
ParameterExpression parameterExpressionA = Expression.Parameter(typeof(int),"a");
//expression.Parameter(typeof(int), "a");//什么意思???
//public static ParameterExpression Expression.Parameter(Type pyte,string name); //創(chuàng)建一個(gè)Expresions.ParameterExpression節(jié)點(diǎn),該節(jié)點(diǎn)可用于標(biāo)識(shí)樹(shù)中的參數(shù)或變量
//返回值Expressions.ParameterExpression,其Expressions.Expression.NodeType屬性等于Expressions.ExpressionType.Parameter,并且其Expressions.Expression.Type和Expressions.ParameterExpression.Name屬性設(shè)置為指定值
ParameterExpression parameterExpressionB = Expression.Parameter(typeof(int), "b");
BinaryExpression binaryExpression = Expression.Add(parameterExpressionA, parameterExpressionB);
//BinaryExpression包含二元運(yùn)算符的表達(dá)式
//public sealed class Expression
//以目錄樹(shù)的形式將強(qiáng)類型 lambda表達(dá)式 表示為數(shù)據(jù)結(jié)構(gòu)
//其中二個(gè)函數(shù)很有意思:
//public TDelegate Compile();將表達(dá)式樹(shù)描述的lambda表達(dá)式編譯為可執(zhí)行代碼并生成表示該lambda表達(dá)式的委托
//public TDelegate Compile(DebugInfoGernerator debugInfoGenerator)帶調(diào)試信息生成器
//Expression
Expression
//也就是說(shuō)最開(kāi)始的Expression
//Expression類是一個(gè)抽象類,表示表達(dá)式目錄樹(shù)節(jié)點(diǎn)的類派生自該基類,它還包含用來(lái)創(chuàng)建各種節(jié)點(diǎn)類型的靜態(tài)工廠方法。
//Expression類有很多子類,比如LambdaExpression,BinaryExpression,ParameterExpression,ConstantExpression,ConditionExpression,GotoExpression,LabelExpression等
//其中LambdaExpression類中:
//public Expression Body{get;}獲取Lambda表達(dá)式的主體
//public string name{get;}獲取Lambda表達(dá)式的名稱
//public overrid sealed ExpressionType NodeType{get;}返回此Expression的節(jié)點(diǎn)類型 注意這種語(yǔ)法格式:因?yàn)樵诟割怑xpression中public virtual ExpressionType NodeType{get;}
//也就是說(shuō)在C#中父類virtual一個(gè)方法或?qū)傩苑椒ㄖ?,在子類中?duì)這個(gè)方法或?qū)傩苑椒梢詏verride,再如果加上sealed則表示不允許修改了
//public ReadOnlyCollection
//pulbic Type ReturnType{get;} 返回值類型
//pubilc override sealed Type[get;}獲取此Expression所表示的表達(dá)式的靜態(tài)類型
Console.WriteLine(expression.Body.ToString()); //(a * b)
Console.WriteLine(expression.NodeType.ToString());//Lambda
Console.WriteLine(parameterExpressionA.NodeType.ToString() + "----" + parameterExpressionA.Type.BaseType.ToString());//Parameter----System.ValueType
//除了System.ValueType,是不是還有引用類型??
//Expression
//Expression
//比如ExpressionType等于ExpressionType.Convert的表達(dá)式操作 Convert強(qiáng)制轉(zhuǎn)換或轉(zhuǎn)換運(yùn)算,如(SampleType)obj;對(duì)于數(shù)值轉(zhuǎn)換,超范圍轉(zhuǎn)換也不會(huì)引發(fā)異常。具體如何寫(xiě)代碼???
//Lambda方法和通過(guò)API創(chuàng)建方法,共二種創(chuàng)建表達(dá)式樹(shù)
//API方法:
ParameterExpression numParameterExpression = Expression.Parameter(typeof(int), "num");
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numLessThanFive = Expression.LessThan(numParameterExpression, five);
Expression
Console.WriteLine("lambda的內(nèi)容:{0}", lambda.ToString());//lambda的內(nèi)容:num => (num < 5)
//表達(dá)式的編譯
var func = lambda.Compile();
Console.WriteLine("lambda的運(yùn)行結(jié)果=" + func(6));
關(guān)于c# 中怎么實(shí)現(xiàn)表達(dá)式樹(shù)實(shí)驗(yàn)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。