2011-06-17 179 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)} –