2016-04-06 23 views
1

alınırken yansımasız, genel bir yöntem yansıtma başarısız çağrılıyor İyi tanımlanmış bir modele sahip iyi tanımlanmış bir web API'sine bir LINQ sağlayıcısı oluşturmaya çalışıyorum.Özel LINQ sağlayıcısı, Task.Result nesnesi

tüm parçaları sağlayıcılarına araya gereken kısmı gidene kadar İyi gidiyordu Yürütme olmayan bir jenerik vardır: Bunları walkthroughs takip ediyorum Özel bir HTTPRequest sınıfının eşzamansız bir yönteminin yansıma kullanılarak çağrıldığı ve parçanın çok iyi çalıştığı yöntem, sorun, döndürülen Görev nesnesindeki Sonuç özelliğinin değerini almaya çalışırken, bir TargetException deyimiyle başarısız olur "Ek bilgiler : Nesne, hedef türüyle eşleşmiyor. Ben iade edilmesi gereken nesne IEnumerable olması gerektiğini düşünüyordum ve ne geliyor

 public override object Execute(Expression expression) 
     { 
      var elementType = TypeSystem.GetElementType(expression.Type); 

      var task = GetResult(expression, elementType); 
      var resultProperty = typeof (Task<>).MakeGenericType(elementType).GetProperty("Result"); 

      //It fails here! 
      var result = resultProperty.GetValue(task); 

      return result; 
     } 

     private async Task GetResult(Expression expression, Type elementType) 
     { 
      var requestUrl = Translate(expression); 

      var method = _httpRequest.GetType().GetMethod("GetHttpRequest").MakeGenericMethod(new[] { elementType }); 
      var task = (Task) method.Invoke(_httpRequest, new object[] { requestUrl }); 
      await task; 
     } 

:

Bu

diğer parçaları alakalı olduğunu sanmıyorum, istisna olur koddur Sonuç mülkiyeti dışında tek bir T ve bunu ele almak zorunda kalacağım ama mevcut istisnanın sebebi olduğuna inanmıyorum.

Herhangi bir yardım için teşekkür ederiz.

+0

'async Task GetResult' Bu yöntemden döndürülen görev beklediğiniz gibi değil, dolayısıyla sonuç yok. –

cevap

2

Sen get burada Task<ElementType>.Result özelliği:

var resultProperty = typeof (Task<>).MakeGenericType(elementType).GetProperty("Result"); 

Ve o zaman tip Task (Not - Task<ElementType>) ait itiraz başvurduğunuz sizin GetResult döner. Yani, yanlış türde bir nesneyi PropertyInfo.GetValue yöntemine aktarıyorsunuz, bu da gözlemlediğiniz istisna ile sonuçlanıyor. GetResult hala Task döndürür rağmen

private Task GetResult(Expression expression, Type elementType) 
    { 
     var requestUrl = Translate(expression); 

     var method = _httpRequest.GetType().GetMethod("GetHttpRequest").MakeGenericMethod(new[] { elementType }); 
     var task = (Task) method.Invoke(_httpRequest, new object[] { requestUrl }); 
     return task; 
    } 

Şimdi, biz gerçekten var Oluşturduğunuz Task<ElementType> olduğu (burada _httpRequest.GetHttpRequest Task<ElementType> döndürdüğünü varsayıyorum) olduğunu biliyoruz ve işler yapmalıdır:

sadece bunu düzeltmek için iyi çalış.

+0

Anladım. ElementType'ın derleme zamanında ne olduğunu bilmediğim için Görev değişkenini Görev 'a nasıl yüklerim? –

+0

Yayınlayamazsınız, çünkü bu gerçekten Görev türüdür. Görev 'unuzu GetResult'un sonunda bekliyorsunuz, böylece sonucu kaybediyorsunuz. Beklemeden GetResult'daki görevi döndürün (neden yapmalısınız?). – Evk