非静态方法需要目标

时间:2012-12-05 06:11:08

标签: c# asp.net-mvc asp.net-mvc-3 entity-framework 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);
}

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

  

错误。       处理您的请求时发生错误。       System.Reflection.TargetException:非静态方法需要一个目标。在   System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)at   System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj,BindingFlags   invokeAttr,Binder binder,Object []参数,CultureInfo文化)at   System.Reflection.RuntimeMethodInfo.Invoke(Object obj,BindingFlags invokeAttr,Binder   binder,Object []参数,CultureInfo文化)at   System.Reflection.RuntimePropertyInfo.GetValue(Object obj,Object [] index)at   System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me,Object instance,Object& memberValue)at at   System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(表达式表达式,ConstantExpression& constantExpression)at at   System.Data.Objects.ELinq.QueryParameterExpression.EvaluateParameter(Object [] arguments)   at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery 1.GetResults(Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator()    在System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 source)at at   lambda_method的LandTitle.Controllers.HomeController.MNRefi()(Closure,ControllerBase,    System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext。的Object [])   controllerContext,IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2个参数)at   Castle.DynamicProxy.AbstractInvocation.Proceed()中的Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()at   Castle.DynamicProxy.AbstractInvocation.Proceed()的Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation调用)at   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.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)

8 个答案:

答案 0 :(得分:440)

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

类似的东西:

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...
    }
}

答案 1 :(得分:28)

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

答案 2 :(得分:12)

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

答案 3 :(得分:1)

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

  

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

     

我再次尝试发送相同的请求。这段时间代码有效   正确地。而且我在邮递员中得到了正确的答复。

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

如果您对GetProperty使用null的对象进行反射,则可能会发生这种情况。

答案 6 :(得分:0)

(这是一个关于错误的简单例子)

此错误发生在 Linq 查询从 DB 上下文获取数据而 DB 上下文匹配 ID 为空时。 假设:我们根据学生记录(参考表)从数据库获取校友信息。

var getAlumniData = DBContext.Alumni.Where(a => a.AlumniID == loginHistory.AlumniID)
                      .Select(a => new Alumni
                       {
                          Enrollment = a.Student.Enrollment,
                          RegistrationNo = a.RegistrationNo,
                          Name = a.Name,
                       }).SingleOrDefault();

我们从用户登录历史中获取匹配的 ID。如果用户登录历史为空,则登录历史记录。 AlumniID 为空。所以它错误地要求需要所需的目标。

答案 7 :(得分:0)

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

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

[DynamicData(nameof(MyFakeData))]
[DataTestMethod]
public void DoMyTests(string someData) {...}

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