我正在尝试实现Queryable接口,我想从表达式中提取类型。
我已使用http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx中的示例实现了Queryable。
当我在Provider中找到Execute方法时,表达式为:
expression = {value(TestApp.HouseQueryable`1[TestApp.House]).OfType().Where(i => (i.Address == "N.125 Oxford St."))}
第一个参数似乎是类型,但从那里我不知道如何从OfType()方法中提取它。有人可以帮我吗?
构建可查询和查询提供程序的代码是教程中的代码。
由于
编辑:为了进一步扩展我的目标,我想根据给定的类型从不同的服务查询。我知道这不是最好的方法,因为我最终会在我的查询提供程序中拥有一个大的IF ELSE。
通过跟踪Ani的响应,我从ExpressionVisitor继承并检查方法调用以提取类型。我只测试了我的场景,它只有一个.OfType(),似乎可以工作。
public class ExpressionTreeModifier : ExpressionVisitor
{
public ExpressionTreeModifier(Expression expression)
{
this.Visit(expression);
}
protected override Expression VisitMethodCall(MethodCallExpression methodCall)
{
var method = methodCall.Method;
if (method.Name == "OfType" && method.DeclaringType == typeof(Queryable))
{
var type = method.GetGenericArguments().Single();
OfType = (Type)type;
}
return base.VisitMethodCall(methodCall);
}
public Type OfType { get;set; }
}
答案 0 :(得分:2)
我不确定你到底在哪里,但要回答你的问题(仅此而已):
IQueryable queryable = ...
var methodCall = queryable.Expression as MethodCallExpression;
if(methodCall != null)
{
var method = methodCall.Method;
if(method.Name == "OfType" && method.DeclaringType == typeof(Queryable))
{
var type = method.GetGenericArguments().Single();
Console.WriteLine("OfType<{0}>", type);
}
}
老实说,不确定这个高度特定的代码如何帮助您编写自己的查询提供程序。你能否扩展一下你的更广泛的目标?