gpt4 book ai didi

c# - 如何使用方法调用生成已编译的 lambda?

转载 作者:太空宇宙 更新时间:2023-11-03 18:01:38 25 4
gpt4 key购买 nike

我在运行时为给定成员生成编译的 getter 方法。现在,我的代码只是假设 getter 方法的结果是一个字符串(适用于测试)。但是,我想使用我编写的自定义转换器类来完成这项工作,见下文,我添加的“ConverterBase”引用。

我不知道如何将对转换器类的调用添加到我的表达式树中。

    public Func<U, string> GetGetter<U>(MemberInfo info)
{
Type t = null;
if (info is PropertyInfo)
{
t = ((PropertyInfo)info).PropertyType;
}
else if (info is FieldInfo)
{
t = ((FieldInfo)info).FieldType;
}
else
{
throw new Exception("Unknown member type");
}

//TODO, replace with ability to specify in custom attribute
ConverterBase typeConverter = new ConverterBase();

ParameterExpression target = Expression.Parameter(typeof(U), "target");
MemberExpression memberAccess = Expression.MakeMemberAccess(target, info);

//TODO here, make the expression call "typeConverter.FieldToString(fieldValue)"

LambdaExpression getter = Expression.Lambda(memberAccess, target);

return (Func<U, string>)getter.Compile();
}

我正在寻找在第二个 TODO 区域中放置的内容(我可以处理第一个 :))。

生成的编译 lambda 应该将 U 类型的实例作为参数,调用指定的成员访问函数,然后使用结果调用转换器的“FieldToString”方法,并返回结果字符串。

最佳答案

您能否说明您希望表达式评估什么(如果它是常规 C#)?我可以很容易地写出这个表达式 - 我只是不完全理解这个问题......

(编辑重新评论) - 在这种情况下,它会是这样的:

    ConverterBase typeConverter = new ConverterBase();
var target = Expression.Parameter(typeof(U), "target");
var getter = Expression.MakeMemberAccess(target, info);
var converter = Expression.Constant(typeConverter, typeof(ConverterBase));

return Expression.Lambda<Func<U, string>>(
Expression.Call(converter, typeof(ConverterBase).GetMethod("FieldToString"),
getter), target).Compile();

或者,如果类型拒绝绑定(bind),则需要注入(inject)强制转换/转换:
    MethodInfo method = typeof(ConverterBase).GetMethod("FieldToString");
return Expression.Lambda<Func<U, string>>(
Expression.Call(converter, method,
Expression.Convert(getter, method.GetParameters().Single().ParameterType)),
target).Compile();

关于c# - 如何使用方法调用生成已编译的 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/320500/

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