当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用方法调用生成已编译的lambda?》经验,为你挑选了1个好方法。

我在运行时为给定的成员生成编译的getter方法.现在,我的代码只是假设getter方法的结果是一个字符串(适用于测试).但是,我想用我编写的自定义转换器类来完成这项工作,请参阅下面的"ConverterBase"参考,我已经添加了.

我无法弄清楚如何将转换器类的调用添加到我的表达式树.

    public Func GetGetter(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)getter.Compile();
    }

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

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



1> Marc Gravell..:

你能说明你想要表达式评估的是什么(如果它是普通的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>(
    Expression.Call(converter, typeof(ConverterBase).GetMethod("FieldToString"),
        getter), target).Compile();

或者如果类型拒绝绑定,则需要注入一个强制转换/转换:

    MethodInfo method = typeof(ConverterBase).GetMethod("FieldToString");
    return Expression.Lambda>(
        Expression.Call(converter, method,
            Expression.Convert(getter, method.GetParameters().Single().ParameterType)),
            target).Compile();

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有