我想将多态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
作为标识符,而不是类型。