2014-03-03 23 views
1

我想實現Queryable接口,我想從表達式中提取類型。如何解析表達式樹來提取類型的條件OfType

我已經使用http://blogs.msdn.com/b/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx中的示例實現了Queryable。

當我到達我的供應商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; } 
} 

回答

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); 
    } 
} 

不知道如何代碼這個高度特異性位真的會幫助你寫你自己的查詢提供者。你能否擴展一些更廣泛的目標?

+0

謝謝,它回答了我所需要的。 –