免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C# Expression Visitor
using System;using System.Linq;using System.Linq.Expressions;using System.Runtime.InteropServices;namespace app{    public abstract class Visitor    {        private readonly Expression node;        protected Visitor(Expression node)        {            this.node = node;        }        public abstract void Visit(string prefix);        public ExpressionType NodeType => this.node.NodeType;        public static Visitor CreateFormatExpression(Expression node)        {            switch (node.NodeType)            {                case ExpressionType.Constant:                            return new ConstantVisitor((ConstantExpression)node);                case ExpressionType.Lambda:                    return new LambdaVisitor((LambdaExpression)node);                case ExpressionType.Parameter:                    return new ParameterVisitor((ParameterExpression)node);                case ExpressionType.Add:                case ExpressionType.Equal:                case ExpressionType.Multiply:                    return new BinaryVisitor((BinaryExpression)node);                case ExpressionType.Conditional:                    return new ConditionalVisitor((ConditionalExpression)node);                case ExpressionType.Call:                    return new MethodCallVisitor((MethodCallExpression)node);                default:                    Console.Error.WriteLine($"Node not processed yet: {node.NodeType}");                    return default(Visitor);            }        }    }    public class LambdaVisitor : Visitor    {        private readonly LambdaExpression node;        public LambdaVisitor(LambdaExpression node) : base(node)        {            this.node = node;        }                        public override void Visit(string prefix)        {            Console.WriteLine($"{prefix} this expession is a {NodeType} expression type");            Console.WriteLine($"{prefix} this name of the lambda is {((node.Name == null) ? "<null>": node.Name)}");            Console.WriteLine($"{prefix} the return is {node.ReturnType.ToString()}");            Console.WriteLine($"{prefix} the expression has {node.Parameters.Count} arguments.They are");            foreach (var argumentExpression in node.Parameters)            {                var argumentVisitor = Visitor.CreateFormatExpression(argumentExpression);                argumentVisitor.Visit(prefix   '\t');            }            Console.WriteLine($"{prefix} The expression body is:");            var bodyVisitor = Visitor.CreateFormatExpression(node.Body);            bodyVisitor.Visit(prefix   '\t');        }    }        public class BinaryVisitor : Visitor    {        private readonly BinaryExpression node;        public BinaryVisitor(BinaryExpression node) : base(node)        {            this.node = node;        }            public override void Visit(string prefix)        {            Console.WriteLine($"{prefix}This binary expression is a {NodeType} expression");            var left = Visitor.CreateFormatExpression(node.Left);            Console.WriteLine($"{prefix}The Left argument is:");            left.Visit(prefix   "\t");            var right = Visitor.CreateFormatExpression(node.Right);            Console.WriteLine($"{prefix}The Right argument is:");            right.Visit(prefix   "\t");        }    }        public class ParameterVisitor : Visitor    {        private readonly ParameterExpression node;        public ParameterVisitor(ParameterExpression node) : base(node)        {            this.node = node;        }            public override void Visit(string prefix)        {            Console.WriteLine($"{prefix}This is an {NodeType} expression type");            Console.WriteLine($"{prefix}Type: {node.Type.ToString()}, Name: {node.Name}, ByRef: {node.IsByRef}");        }    }        public class ConstantVisitor : Visitor    {        private readonly ConstantExpression node;        public ConstantVisitor(ConstantExpression node) : base(node)        {            this.node = node;        }        public override void Visit(string prefix)        {            Console.WriteLine($"{prefix}This is an {NodeType} expression type");            Console.WriteLine($"{prefix}The type of the constant value is {node.Type}");            Console.WriteLine($"{prefix}The value of the constant value is {node.Value}");        }    }        public class ConditionalVisitor : Visitor{    private readonly ConditionalExpression node;    public ConditionalVisitor(ConditionalExpression node) : base(node)    {        this.node = node;    }    public override void Visit(string prefix)    {        Console.WriteLine($"{prefix}This expression is a {NodeType} expression");        var testVisitor = Visitor.CreateFormatExpression(node.Test);        Console.WriteLine($"{prefix}The Test for this expression is:");        testVisitor.Visit(prefix   "\t");        var trueVisitor = Visitor.CreateFormatExpression(node.IfTrue);        Console.WriteLine($"{prefix}The True clause for this expression is:");        trueVisitor.Visit(prefix   "\t");        var falseVisitor = Visitor.CreateFormatExpression(node.IfFalse);        Console.WriteLine($"{prefix}The False clause for this expression is:");        falseVisitor.Visit(prefix   "\t");    }}public class MethodCallVisitor : Visitor{    private readonly MethodCallExpression node;    public MethodCallVisitor(MethodCallExpression node) : base(node)    {        this.node = node;    }    public override void Visit(string prefix)    {        Console.WriteLine($"{prefix}This expression is a {NodeType} expression");        if (node.Object == null)            Console.WriteLine($"{prefix}This is a static method call");        else        {            Console.WriteLine($"{prefix}The receiver (this) is:");            var receiverVisitor = Visitor.CreateFormatExpression(node.Object);            receiverVisitor.Visit(prefix   "\t");        }        var methodInfo = node.Method;        Console.WriteLine($"{prefix}The method name is {methodInfo.DeclaringType}.{methodInfo.Name}");        // There is more here, like generic arguments, and so on.        Console.WriteLine($"{prefix}The Arguments are:");        foreach(var arg in node.Arguments)        {            var argVisitor = Visitor.CreateFormatExpression(arg);            argVisitor.Visit(prefix   "\t");        }    }}    }

?

來源:http://www.icode9.com/content-1-183751.html
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
xmlnode 的value與innertext區(qū)別
Linq之Expression進(jìn)階
JavaScript 節(jié)點(diǎn)介紹及其應(yīng)用
HOW TO:使用 Visual C
JavaScript中Element與Node的區(qū)別,children與childNodes的區(qū)別
DOM系列:DOM節(jié)點(diǎn)屬性
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服