除了反思之外的另一种选择

本文关键字:另一种 选择 | 更新日期: 2023-09-27 18:36:55

我遇到一种情况,即我使用反射来调用一种方法,以便提供在运行时之前未知的投影表达式的 TResult。TResult 作为字符串包含在表达式节点中,我使用 Type.GetType() 检索它。一旦我有了该类型,我就可以将表达式节点转换回可查询的表达式中。选择()可以理解。虽然所有这些都完美运行,但我想知道是否有其他方法可以完成将参数作为方法的泛型类型传递的任务。

public static string ProcessExpressionNode<TSource>(this IQueryable<TSource> sourceQuery, ExpressionNode expressionNode)
        {
            var destType = Type.GetType(expressionNode.Type.GenericArguments[1].Name);
            var result = typeof(QueryableExtensions).GetMethod("ExecuteExpression", BindingFlags.Static | BindingFlags.NonPublic)
                .MakeGenericMethod(destType, typeof(TSource))
                .Invoke(null, new object[] { expressionNode, sourceQuery });

            return JsonConvert.SerializeObject(result);
        }
internal static List<TResult> ExecuteExpression<TResult, TSource>(ExpressionNode expressionNode, IQueryable<TSource> source)
        {
            var result = source.Select(expressionNode.ToExpression<Func<TSource,TResult>>());
            return result.ToList();
        }

-更新 1:好的,在服务器上我有一个表达式

Expression<Func<Person, PersonWithBlogPostsDto>> expression1 = person => new PersonWithBlogPostsDto
            {
                DisplayName = person.FirstName,
                Key = person.Key,
                Posts = person.Blog.Posts
            };

被序列化

var serializedExpression = expression1.ToExpressionNode();

在通过 wcf 传输到服务器后,我需要将表达式节点转换回表达式中>以便我可以使用客户端上生成的表达式查询 person 的数据源。我可以从表达式节点内的字符串确定返回类型。返回类型将根据所使用的 dto 而变化,因此我无法设置

Func<Person, PersonWithBlogPostsDto>> 

超前。换句话说,我需要PersonWithBlogPostDto作为一个参数。我能够想出的唯一方法是使用反射来调用该方法。

除了反思之外的另一种选择

如果您没有任何性能问题,则无需更改。

如果你有或认为会有,你可以看看

Fasterflect - .NET 反射变得快速而简单

http://fasterflect.codeplex.com/