【发布时间】:2013-10-26 15:24:33
【问题描述】:
我有一种情况,我使用反射来调用方法,以提供投影表达式的 TResult,该投影表达式在运行时才未知。 TResult 作为字符串包含在表达式节点中,我使用 Type.GetType() 检索它。一旦我有了那个类型,我就可以将 ExpressionNode 转换回一个 queryable.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> 以便我可以使用客户端生成的表达式查询 person 的数据源。我可以从表达式节点中的字符串确定返回类型。返回类型会根据所使用的 dto 而改变,所以我无法设置
Func<Person, PersonWithBlogPostsDto>>
提前。换句话说,我需要 PersonWithBlogPostDto 作为参数。我能想到的唯一方法是使用反射来调用该方法。
【问题讨论】:
-
举一个具体的例子说明你想要达到的目标。
-
反射是为了做到这一点。完全不清楚为什么您需要替代方案。你想解决什么问题?
-
真的没问题,如果我不需要我知道我可以制作的返回类型和使用动态的操作,我只是寻找一个更快的替代方案,我在想这种情况可能存在类似的东西。跨度>
-
我认为列出所有更慢和更痛苦的技术比试图胜过反思要容易得多。几年前,我在一个实时图像处理应用程序中使用了反射,速度不是问题。如果您使用高分辨率计时器并获得单个操作的精确计时,那么也许 StackOverflow 上的人们可以帮助您确定可以和应该优化的内容。无论如何,祝你好运!
-
感谢 Rethunk 的建议
标签: c# reflection