我在运行时为给定的成员生成编译的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"方法,并返回结果字符串.
你能说明你想要表达式评估的是什么(如果它是普通的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();