Exemple #1
0
        static void Main(string[] args)
        {
            //SyntaxePerf.Run();

            LinqOperator.GroupByOperator();
            //LinqOperator.ProjectionOperator();
            //LinqOperator.ConversionOperator();
            //LinqOperator.ElementOperator();
        }
Exemple #2
0
        public AnalyzedMethod Analyze(MethodDefinition method)
        {
            MethodDefinition nestedMethodToken = null;
            OperatorType     operatorTypeType  = OperatorType.None;

            var operators = new Collection <LinqOperator>();

            foreach (var instruction in method.Body.Instructions)
            {
                var opCode = instruction.OpCode;

                if (opCode != OpCodes.Ldftn && opCode != OpCodes.Call)
                {
                    continue;
                }

                if (opCode == OpCodes.Ldftn)
                {
                    nestedMethodToken = GetToken <MethodDefinition>(instruction);
                    continue;
                }

                if (opCode == OpCodes.Call)
                {
                    var operatorMethodToken = GetToken <GenericInstanceMethod>(instruction);

                    if (operatorMethodToken == null)
                    {
                        continue;
                    }

                    operatorTypeType = (OperatorType)Enum.Parse(typeof(OperatorType), operatorMethodToken.Name);
                }

                if (nestedMethodToken == null || operatorTypeType == OperatorType.None)
                {
                    continue;
                }

                var linqOperator = new LinqOperator(nestedMethodToken, operatorTypeType);
                operators.Add(linqOperator);

                nestedMethodToken = null;
                operatorTypeType  = OperatorType.None;
            }

            return(new AnalyzedMethod(operators.ToReadOnlyCollection()));

            T GetToken <T>(Instruction instruction) where T : class
            {
                return(instruction.Operand as T);
            }
        }