{ return new SomeType1((P1)args[0], -6ren">
gpt4 book ai didi

c# - 如何在 "sub"表达式中使用 lambda 表达式参数?

转载 作者:行者123 更新时间:2023-11-30 12:17:10 25 4
gpt4 key购买 nike

我希望能够构建如下委托(delegate)的表达式:

Func<object[], object> createSomeType1 = (args) =>
{
return new SomeType1((P1)args[0], (P2)args[1], (P3)args[2]);
};

我刚开始使用手工制作的表达式,如果这是一个相当简单的问题(或者我误解了什么),请原谅。

我知道要创建具有正确类型的构造函数,我会执行以下操作:

var p1 = Expression.Parameter(typeof(P1));
var p2 = Expression.Parameter(typeof(P2));
var p3 = Expression.Parameter(typeof(P3));
var someType1Exp = Expression.New(constructorInfo, p1, p2, p3);

然后我知道“外部”lambda 是这样声明的:

Expression<Func<object[], object>>.Lambda<Func<object[], object>>(
someType1Exp,
Expression.Parameter(typeof(object[])));

我无法思考如何将参数从外部表达式“传递”到内部表达式,然后将其转换为正确的类型。

任何正确方向的提示都将受到赞赏。

最佳答案

我在 iPod 上,所以现在不能给出一个完整的例子:但是:

  • 声明一个类型为 object[] 的参数 (Expression.Param(typeof(object[]))) 并将其存储在一个变量中
  • 对于数组中的每个术语,使用数组 indexer 获取索引器的表达式,然后“Convert”或“cast”(又是 iPod!)投它
  • 使用Expression.Invoke,传递内部表达式加上您在上面生成的索引器+cast

如果您需要(当我在 PC 上时),我很乐意稍后做一个完整的示例


完整示例:

Type[] types = new Type[] { typeof(int), typeof(float), typeof(string) };

var constructorInfo = typeof(SomeType).GetConstructor(types);
var parameters = types.Select((t,i) => Expression.Parameter(t, "p" + i)).ToArray();
var someType1Exp = Expression.New(constructorInfo, parameters);
var inner = Expression.Lambda(someType1Exp, parameters);

var args = Expression.Parameter(typeof(object[]), "args");
var body = Expression.Invoke(inner,
parameters.Select((p,i) => Expression.Convert(Expression.ArrayIndex(args, Expression.Constant(i)), p.Type)).ToArray());
var outer = Expression.Lambda<Func<object[], object>>(body, args);
var func = outer.Compile();

object[] values = {1, 123.45F, "abc"};
object obj = func(values);
Console.WriteLine(obj);

或者作为单个表达式:

Type[] types = new Type[] { typeof(int), typeof(float), typeof(string) };   
var constructorInfo = typeof(SomeType).GetConstructor(types);

var args = Expression.Parameter(typeof(object[]), "args");
var body = Expression.New(constructorInfo,
types.Select((t,i) => Expression.Convert(Expression.ArrayIndex(args, Expression.Constant(i)), t)).ToArray());
var outer = Expression.Lambda<Func<object[], object>>(body, args);
var func = outer.Compile();

object[] values = {1, 123.45F, "abc"};
object obj = func(values);
Console.WriteLine(obj);

关于c# - 如何在 "sub"表达式中使用 lambda 表达式参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4135625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com