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

时间:2013-10-26 15:24:34

标签: c# reflection

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

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传输到服务器之后,我需要将expressionNode转换回Expression&gt;这样我就可以用客户端上生成的表达式查询人的数据源。我可以从表达式节点中的字符串确定返回类型。返回类型将根据使用的dto而改变,因此我无法设置

的转换
Func<Person, PersonWithBlogPostsDto>> 
提前了。换句话说,我需要PersonWithBlogPostDto作为参数。我能够做到这一点的唯一方法是使用反射来调用方法。

1 个答案:

答案 0 :(得分:1)

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

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

Fasterflect - 快速而简单的.NET反射

http://fasterflect.codeplex.com/