我正在做一个Func -> 表达 -> Func转换。如果我从方法(下面的第一个示例)创建 Func() ,它工作得很好,但是如果我使用表达式树(第二个示例)创建函数,它会失败并显示空引用异常当访问时func2.Method.DeclaringType.FullName。这是因为声明类型一片空白。 (INJection 使用反射,所以我认为这就是它需要 DeclaringType 的原因。)
如何为通过编译表达式树创建的 Func 填写 DeclaringType 类型? (也许这是不可能的?)DeclaringType 在第一个示例中设置。
使用方法中的函数...(效果很好)
// Build a Func<>
Func<int, int> add = Add;
// Convert it to an Expression using NJection Library
Expression<Func<int, int>> expr = ToExpr<Func<int, int>>(add);
// Convert it back to a Func<>
Func < int, int> func = expr.Compile();
// Run the Func<>
int result = func(100);
使用表达式树(不起作用)...
// Build a Func<> using an Expression Tree
ParameterExpression numParam = Expression.Parameter(typeof(int));
ConstantExpression five = Expression.Constant(5, typeof(int));
BinaryExpression numAddFive = Expression.Add(numParam, five);
Func<int, int> func2 =
Expression.Lambda<Func<int, int>>(
numAddFive,
new ParameterExpression[] { numParam }).Compile();
// Convert to an Expression using NJection (EXCEPTION ON NEXT LINE)
// ToExpr is trying to access func2.Method.DeclaringType.FullName(DeclaringType is null)
Expression<Func<int, int>> exp2 = ToExpr<Func<int, int>>(func2);
// Convert it back to a Func<>
Func<int, int> func2b = exp2.Compile();
// Run the Func<>
int result2 = func2b(100);