非静态方法需要目标


238

我有一个控制器操作,该操作在Firefox本地和生产环境中以及本地IE上均能正常运行,但在生产环境中却无法正常运行。这是我的控制器动作:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    decimal OP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.SalesPrice)
        .FirstOrDefault()
        .OP;

    decimal MP = landTitleUnitOfWork.Sales.Find()
        .Where(x => x.Min >= calculationViewModel.MortgageAmount)
        .FirstOrDefault()
        .MP;

    calculationViewModel.LoanAmount = (OP + 100) - MP;
    calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

    return View(calculationViewModel);
}

这是我在IE中得到的堆栈跟踪:

错误。处理您的请求时发生错误。System.Reflection.TargetException:非静态方法需要一个目标。在System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)在System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,活页夹活页夹,Object []参数,CultureInfo文化)在System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr,活页夹活页夹,System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object []索引)位于System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression我,对象实例, System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression,1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(可空1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable的1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1源)在LandTitle.Controllers.HomeController.MNRefi()在lambda_method(封闭,ControllerBase ,Object []),位于System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2个参数)在Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()在Castle.DynamicProxy.AbstractInvocation.Proceed()在Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation调用)在Castle.DynamicProxy.AbstractInvocationed() Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod(ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary``2个参数)at System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass37。<> c__DisplayClass39.b__33()at System.Web.Mvc.Async System.Web.Mvc.Async.AsyncControllerActionInvoker中的<> c__DisplayClass4f.b__49()。System.Web.Mvc.Async中的<> c__DisplayClass37.b__36(IAsyncResult asyncResult)。AsyncControllerActionInvoker。<> c__DisplayClass25。<> c__DisplayClass2a.b__20()在System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass25.b__22(IAsyncResult asyncResult)


Answers:


497

我认为当您在运行时为空引用的lambda中使用变量时,会发生此令人困惑的异常。在您的情况下,我将检查您的变量CalculationViewModel是否为空引用。

就像是:

public ActionResult MNPurchase()
{
    CalculationViewModel calculationViewModel = (CalculationViewModel)TempData["calculationViewModel"];

    if (calculationViewModel != null)
    {
        decimal OP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.SalesPrice)
            .FirstOrDefault()
            .OP;

        decimal MP = landTitleUnitOfWork.Sales.Find()
            .Where(x => x.Min >= calculationViewModel.MortgageAmount)
            .FirstOrDefault()
            .MP;

        calculationViewModel.LoanAmount = (OP + 100) - MP;
        calculationViewModel.LendersTitleInsurance = (calculationViewModel.LoanAmount + 850);

        return View(calculationViewModel);
    }
    else
    {
        // Do something else...
    }
}

71
+1这绝对是Where()lambda表达式中NRE的结果。好答案;今天为我节省了时间。
Yuck

遇到同样的问题,即无法从继承的控制器构造函数中加载并设置值,然后将其传递给子控制器的构造函数中的linq查询,并抛出此神秘错误!
逸生

3
我认为您收到此错误的原因是Lambda在内部进行了一些反射,并且正在尝试在对象上调用方法/属性,但是未传递对象,因此它正在尝试调用方法/ property就像它是静态的一样,但是它最终意识到它不是静态的。这就是为什么您没有得到未设置为对象消息实例的普通旧对象引用的原因。
墨尔本开发商

只需阅读第一句话就足以解决问题
Antoine Pelletier

33

通常在目标为空时发生。因此最好先检查调用目标,然后再执行linq查询。


5
在我的情况下,where子句中为空引用异常
BraveNewMath 2015年

12

当我们手动实例化一个实体而不是通过将解析所有导航属性的DBContext实例化时,我发现这个问题在Entity Framework中很普遍。如果表之间存在外键引用(导航属性),并且您在lambda中使用这些引用(例如ProductDetail.Products.ID),那么如果您手动创建实体,则“ Products”上下文将保持为空。


2

所有答案都指向带有NRE(空引用异常)的Lambda表达式。我发现使用Linq to Entities时也会发生这种情况。我认为指出此异常不仅限于Lambda表达式内的NRE会有所帮助。


1

我在邮差工具中测试WebAPI时遇到此错误。

构建代码后,如果在调试模式下删除任何行(例如,在我的情况下,我删除一条注释行,则会发生此错误...),则将发生“ 非静态方法需要目标 ”错误。

同样,我尝试发送相同的请求。这段时间代码正常工作。我在邮递员中得到了正确的答复。

我希望它将对某人有用...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.