非静态方法需要目标

use*_*794 222 c# asp.net-mvc entity-framework asp.net-mvc-3 entity-framework-5

我有一个控制器动作,可以在本地和生产中使用Firefox,在本地使用IE,但在生产中不是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);
}
Run Code Online (Sandbox Code Playgroud)

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

错误.处理您的请求时发生错误.System.Reflection.TargetException:非静态方法需要一个目标.System.Reflection.RuntimeMethodInfo.Invoke的System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化)中的System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)处于System.Reflection.RuntimeMethodInfo.Invoke(Object obj, System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me,Object instance,System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)中的BindingFlags invokeAttr,Binder binder,Object []参数,CultureInfo文化) System.Data.Objects.ELinq.ELinqQueryState上的System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments)中的System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression,ConstantExpression&constantExpression)中的Object&memberValue) .GetExecutionPlan(Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()在System.Linq.Enumerable.FirstOrDefault [T 来自1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryableCastle.Proxies的System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary2参数)的lambda_method(Closure,ControllerBase,Object [])中的LandTitle.Controllers.HomeController.MNRefi()的源代码(IEnumerable 1 source)在Castle.Proxies.Asvideo.TrocodAnTergetMotod.InvokeMethodOnTarget()中的Castle.DynamicProxy.AbstractInvocation.Proceed()在Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod的Castle.DynamicProxy.AbstractInvocation.Proceed()中的Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation调用) (ControllerContext controllerContext,ActionDescriptor actionDescriptor,IDictionary`2参数)在System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass37.<> c__DisplayClass39.b__33()at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass4f.b__49 ()at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass37.b__36(IAsyncResult asyncResult)at at System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass25.<> c__DisplayClass2a.b__20()在System.Web.Mvc.Async.AsyncControllerActionInvoker.<> c__DisplayClass25.b__22(IAsyncResult asyncResult)

Maa*_*ten 471

我认为当你在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...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • +1这绝对是`Where()`lambda表达式中NRE的结果.很好的答案; 今天救了我几个小时. (65认同)
  • 我认为你得到这个错误的原因是Lambda在内部进行了一些反射并且它试图调用对象上的方法/属性,但是没有传入一个对象所以它试图调用该方法/ property就像它是静态的,但它最终意识到它不是静态的.这就是为什么不将普通的旧对象引用设置为对象消息的实例. (3认同)

小智 29

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

  • 在我的例子中,它是where子句中的空引用异常 (5认同)

小智 12

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


Stu*_*tLC 8

Non-static method requires a target 对于在运行 MS Test 单元测试时遇到错误的任何人[DynamicData] [DataTestMethod],该错误可能是由于未进行静态数据测试场景收集而引起的static,即确保您具有:

public **static** IEnumerable<object[]> MyFakeData => 
        new[]
        {
            new object[] { "Foo" },
            new object[] { "Bar" }
        };

[DynamicData(nameof(MyFakeData))]
[DataTestMethod]
public void DoMyTests(string someData) {...}
Run Code Online (Sandbox Code Playgroud)

调试起来非常烦人,因为没有有用的堆栈跟踪

  • 谢谢你!这对我来说很合适。 (3认同)

Nat*_*han 5

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