繁体   English   中英

非静态方法需要一个目标

[英]Non-static method requires a target

我有一个控制器操作,它在本地和生产环境中都可以在 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, Binder binder, Object[] parameters, CultureInfo culture) 在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index) at System.Data.Objects.ELinq.QueryParameterExpression.TryGetFieldOrPropertyValue(MemberExpression me, Object instance, Object& memberValue) at System.Data.Objects.ELinq.QueryParameterExpression.TryEvaluatePath(Expression expression, ConstantExpression& constantExpression) 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 forMergeOption) at System.Data.Objects.ObjectQuery 1.System.Collections.Generic.IEnumerable.GetEnumerator() at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable 1 source) at LandTitle.Controllers .HomeController.MNRefi() at lambda_method(Closure , ControllerBase , Object[] ) at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary 2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary 2 参数) at Castle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget() at Castle.DynamicProxy.AbstractInvocation.Proceed() at Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation invocation) at Castle.Ab Castle. () 在 Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary``2 个参数)在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.b__33() 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.b__49() 在 System .Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.b__36(IAsyncResult asyncResult) 在 System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.b__20() 在 System.Web.Mvc.Async.AsyncControllerInAction .<>c__DisplayClass25.b__22(IAsyncResult asyncResult)

我认为当您在 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...
    }
}

通常它发生在目标为空时。 所以最好先检查调用目标,然后再做 linq 查询。

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

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

我在 Postman 工具中测试 WebAPI 时遇到了这个错误。

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

我再次尝试发送相同的请求。 这次代码工作正常。 我在 Postman 中得到了正确的响应。

我希望它会用于某人...

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

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

当 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 为空。 所以它错误地询问需要所需的目标。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM