2011-06-17 176 views
0

按照我剛纔的問題:C#拋出異常

Lambda expression to access a property of an object that is property of another object in c#

我現在有一個問題:

var param = Expression.Parameter(typeof(GAcordos.Models.Contratos), "x"); 
        var body = Expression.Equal(Expression.PropertyOrField(Expression.PropertyOrField(param, propName[0]), columnName.ToString()), fixedItem, false, Type.GetType("GAcordos.Helpers.Comparators").GetMethod(oper, new Type[] { propType, propType })); 
        var lambda = Expression.Lambda<Func<GAcordos.Models.Contratos, bool>>(body, param); 

        contratosList = contratosList.Where(lambda).AsQueryable(); 

當將lambda傳遞給Expression.Where方法,它不會執行我給予Equal Expression的替換方法,並執行標準的Equal比較。

如果我編譯拉姆達:

contratosList = contratosList.Where(lambda.Compile()).AsQueryable(); 

它引發不設置到對象的實例異常對象引用。在查看後,用下面的堆棧跟蹤:

at lambda_method(Closure , Contratos) 
at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext() 
at System.Linq.Buffer`1..ctor(IEnumerable`1 source) 
at System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext() 
at System.Linq.Enumerable.Count[TSource](IEnumerable`1 source) 
at lambda_method(Closure) 
at System.Linq.EnumerableExecutor`1.Execute() 
at System.Linq.EnumerableQuery`1.System.Linq.IQueryProvider.Execute[S](Expression expression) 
at System.Linq.Queryable.Count[TSource](IQueryable`1 source) 
at MvcContrib.Pagination.LazyPagination`1.TryExecuteQuery() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\Pagination\LazyPagination.cs:line 62 
at MvcContrib.Pagination.LazyPagination`1.get_TotalItems() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\Pagination\LazyPagination.cs:line 85 
at MvcContrib.UI.Pager.Pager.ToHtmlString() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\UI\Pager\Pager.cs:line 130 
at MvcContrib.UI.Pager.Pager.ToString() in C:\Users\daniel.almeida\Downloads\MVCContrib.source\src\MVCContrib\UI\Pager\Pager.cs:line 125 
at ASP._Page_Views_Shared_Pager_cshtml.Execute() in c:\inetpub\wwwroot\Empresas\Proactivos\GAcordos\GAcordos\Views\Shared\Pager.cshtml:line 4 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) 
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) 
at System.Web.Mvc.HtmlHelper.RenderPartialInternal(String partialViewName, ViewDataDictionary viewData, Object model, TextWriter writer, ViewEngineCollection viewEngineCollection) 
at System.Web.Mvc.Html.RenderPartialExtensions.RenderPartial(HtmlHelper htmlHelper, String partialViewName, Object model) 
at ASP._Page_Views_Contratos_Index_cshtml.Execute() in c:\inetpub\wwwroot\Empresas\Proactivos\GAcordos\GAcordos\Views\Contratos\Index.cshtml:line 29 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy() 
at System.Web.Mvc.WebViewPage.ExecutePageHierarchy() 
at System.Web.WebPages.StartPage.RunPage() 
at System.Web.WebPages.StartPage.ExecutePageHierarchy() 
at System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) 
at System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) 
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) 
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass1c.<InvokeActionResultWithFilters>b__19() 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter filter, ResultExecutingContext preContext, Func`1 continuation) 

出了什麼問題?

回答

0

很難說,但如果我不得不猜測我會說你的GetMethod調用返回null。

你能把這一行分解成一個臨時變量並檢查它的值嗎?

Type.GetType("GAcordos.Helpers.Comparators").GetMethod(oper, new Type[] { propType, propType }) 

或者更好的是,讓一些獨立的repro,這裏的人可以運行。

+0

不,當我打電話'Type.GetType( 「GAcordos.Helpers.Comparators」)GetMethod(OPER,新類型[] {propType,propType})'返回{布爾包含(System.String,System.String)} –