You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.0 KiB
75 lines
2.0 KiB
using EC.Helper.RabbitFunc.Runtime;
|
|
using System.Collections.ObjectModel;
|
|
using System.Text;
|
|
|
|
namespace EC.Helper.RabbitFunc.Expressions;
|
|
|
|
public class LambdaExpression : Expression
|
|
{
|
|
internal LambdaExpression(string name, Expression body, params ParameterExpression[] parameters)
|
|
: base(ExpressionType.Lambda)
|
|
{
|
|
Name = name;
|
|
Parameters = new ReadOnlyCollection<ParameterExpression>(parameters);
|
|
Body = body;
|
|
}
|
|
|
|
public RabbitDomain Domain { get; internal set; }
|
|
|
|
public string Name { get; }
|
|
|
|
public ReadOnlyCollection<ParameterExpression> Parameters { get; }
|
|
|
|
public Expression Body { get; }
|
|
|
|
public override Type Type => typeof(double);
|
|
|
|
public Delegate Compile(Type deletageType = null)
|
|
{
|
|
var lambdaCompiler = new ExpressionCompiler();
|
|
return lambdaCompiler.Compile(this, deletageType);
|
|
}
|
|
|
|
public T Compile<T>()
|
|
{
|
|
return (T)(object)Compile(typeof(T));
|
|
}
|
|
|
|
public override object Eval(RuntimeContext context)
|
|
{
|
|
if (context == null)
|
|
throw new ArgumentNullException(nameof(context));
|
|
|
|
var lambdaContext = new RuntimeContext(context);
|
|
lambdaContext.Domain = Domain;
|
|
for (int i = 0; i < Parameters.Count; i++)
|
|
{
|
|
var parameter = Parameters[i];
|
|
var value = parameter.Eval(context);
|
|
lambdaContext.Variable(parameter.Name, value);
|
|
}
|
|
|
|
return Body.Eval(lambdaContext);
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
var sb = new StringBuilder();
|
|
sb.Append(Name).Append('(');
|
|
using (var e = Parameters.GetEnumerator())
|
|
{
|
|
if (e.MoveNext())
|
|
{
|
|
sb.Append(e.Current.Name);
|
|
while (e.MoveNext())
|
|
{
|
|
sb.Append(',');
|
|
sb.Append(e.Current.Name);
|
|
}
|
|
}
|
|
}
|
|
|
|
sb.Append(")=").Append(Body.ToString());
|
|
return sb.ToString();
|
|
}
|
|
}
|