如何将多层的lambda语句字符串解析到dynamicexpression.parselambda中



我想将多态lambda字符串(实际上是一个小程序(传递到DynamicExpression.ParseLambda中,但我担心我可能已经达到了其局限性。我已经编写了代码来喂养小lambda表达式,但我认为它会在完整的程序中扼杀。

到目前为止,McVe是McVe。它显示了原始算法buildSieve((,还显示了lambda等效的开始,但在第一行失败,并且异常Unknown identifier 'long'

using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using diag=System.Diagnostics;
using myAlias = System.Linq.Dynamic;   //install package 'System.Linq.Dynamic' v.1.0.7 with NuGet
namespace LambdaStatement
{
    class Program
    {
        static void Main(string[] args)
        {
            BuildSieveLambda();
            Console.ReadKey();
        }
        static void BuildSieveLambda()
        {
            try
            {
                var pList = new List<ParameterExpression>();
                pList.Add(Expression.Parameter(typeof(int), "x"));
                LambdaExpression e = myAlias.DynamicExpression.ParseLambda(pList.ToArray(), null, "long n = 2000000;");
            }
            catch (Exception ex)
            {
                string msg = GetExMessage(ex);
                diag.Debug.WriteLine("DEBUGME: " + msg);
                throw new Exception(msg);
            }
        }
        public static string GetExMessage(Exception ex)
        {
            string ret = ex.Message;
            if (ex.InnerException!=null)
            {
                ret= ret+ ": " + GetExMessage(ex.InnerException);
            }
            return ret;
        }

        static void BuildSieve()
        {
            //https://gist.github.com/gideondsouza/1978926  Sieve of Eratosthenes C# implementation by code Gideon Israel Dsouza
            long n = 2000000;
            bool[] e = new bool[n];//by default they're all false
            for (int i = 2; i < n; i++)
            {
                e[i] = true;//set all numbers to true
            }
            //weed out the non primes by finding mutiples 
            for (int j = 2; j < n; j++)
            {
                if (e[j])//is true
                {
                    for (long p = 2; (p * j) < n; p++)
                    {
                        e[p * j] = false;
                    }
                }
            }
        }

您可能认为这是不可能的,但是我已经看到了C#代码中一些非常复杂的Lambda表达式,实际上是完整的方法实现。因此,如果C#编译器或Visual Studio可以执行此操作,那么是否可以访问该API?

您需要添加 n,就像添加 x

pList.Add(Expression.Parameter(typeof(long), "n"));
LamdaExpression e = myAlias.DynamicExpression.ParseLamda(pList.ToArray(), null, "n = 200000");

,尽管我承认,我不知道这个程序会做什么,但这就是为什么您会遇到错误的原因。它是在字符串中读取long作为标识符,而不是类型。

相关内容

  • 没有找到相关文章

最新更新