gpt4 book ai didi

c# - 创建所有 ExpressionTree/Func 参数的数组

转载 作者:行者123 更新时间:2023-11-30 16:21:37 25 4
gpt4 key购买 nike

以下程序的输出是:

首先:System.String。第二:System.String。

预期结果是:第一:你好1。第二个:hello2。

如果我将索引硬编码为 1 或 2Expression.Assign(resultArrayAccessor, parameters[0]) 它有效,但我需要在变量 i 之后有索引。

    public static void Main()
{
var type = typeof(Func<string, string, object>);
var del = GenerateFunc<Func<string, string, object>>(type);
del("hello1", "hello2");
Console.ReadLine();
}

public static T GenerateFunc<T>(Type type)
{
var i = Expression.Parameter(typeof (int), "i");

var x = type.GetMethod("Invoke");
var target = typeof (Program).GetMethod("Target");

var resultArray = Expression.Parameter(typeof(object[]), "result");
var parameterArray = Expression.Parameter(typeof(ParameterExpression[]), "parameters");

var resultArrayAccessor = Expression.ArrayAccess(resultArray, i);
var parameterArrayAccessor = Expression.ArrayAccess(parameterArray, i);

var label = Expression.Label();

var parameters = x.GetParameters().Select(p => Expression.Parameter(p.ParameterType, p.ParameterType.ToString())).ToArray();

var block = Expression.Block(x.ReturnType,
new[] { resultArray, i, parameterArray },
Expression.Assign(resultArray, Expression.Constant(new object[parameters.Length])),
Expression.Assign(parameterArray, Expression.Constant(parameters)),
Expression.Loop(
Expression.Block(
Expression.IfThenElse(
Expression.LessThan(i, Expression.Constant(parameters.Length)),
Expression.Block(
Expression.Assign(resultArrayAccessor, parameterArrayAccessor),
Expression.PostIncrementAssign(i)
),
Expression.Break(label)
)
),
label
),

Expression.Call(target, resultArray)
);


return Expression.Lambda<T>(block, parameters).Compile();
}

public static object Target(object[] test)
{
Console.WriteLine("First: " + test[0] + ". Second: " + test[1] + ".");
return null;
}

最佳答案

终于弄明白了,语法更简单,而且实际有效;)

public static T GenerateFunc<T>(Type type)
{
var target = typeof (Program).GetMethod("Target");

var invokeMethod = type.GetMethod("Invoke");
var parameters = invokeMethod
.GetParameters()
.Select(pi => Expression.Parameter(pi.ParameterType, pi.Name))
.ToList();

var parametersExpression = Expression.NewArrayInit(typeof(object), parameters);
var body = Expression.Call(target, parametersExpression);
return Expression.Lambda<T>(body, parameters).Compile();
}

关于c# - 创建所有 ExpressionTree/Func 参数的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13078363/

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