非静的メソッドにはターゲットが必要です


238

ローカルと本番環境の両方で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.Invoke(Object obj、System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)at System.Reflection.RuntimeMethodInfo.InvokeArgumentsCheck(Object obj、BindingFlags invokeAttr、Binderバインダ、Object []パラメータ、CultureInfoカルチャ)at System.Reflection.RuntimeMethodInfo.Invoke(Object obj、 BindingFlags invokeAttr、バインダーバインダー、Object []パラメーター、CultureInfoカルチャー)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、1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(Nullable 1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable.GetEnumerator()at System.Linq.Enumerable.FirstOrDefault [TSource](IEnumerable 1 source) at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable1 source)at LandTitle.Controllers.HomeController.MNRefi()at lambda_method(Closure、ControllerBase 、Object [])System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext、IDictionary2 parameters) at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionaryCastle.Proxies.Invocations.ControllerActionInvoker_InvokeActionMethod.InvokeMethodOnTarget()at Castle.DynamicProxy.AbstractInvocation.Proceed()at Glimpse.Mvc3.Interceptor.InvokeActionMethodInterceptor.Intercept(IInvocation invocation)at Castle.DynamicProxy.AbstractProce.Probs.Proxy.Abstract Castle.Proxies.AsyncControllerActionInvokerProxy.InvokeActionMethod(ControllerContext controllerContext、ActionDescriptor actionDescriptor、IDictionary``2 parameters)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 System.Web.Mvc.Async。AsyncControllerActionInvoker。<> c__DisplayClass25。<> c__DisplayClass2a.b__20()at System.Web.Mvc.Async.AsyncControllerActionInvoker。<> c__DisplayClass25.b__22(IAsyncResult asyncResult)


回答:


497

実行時にnull参照であるラムダで変数を使用すると、この紛らわしい例外が発生すると思います。あなたの場合、あなたの変数calculationViewModelがnull参照かどうかを確認します。

何かのようなもの:

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()ラムダ式のNREの結果です。すばらしい答えです。今日、私は時間を節約できました。
Yuck

値が読み込まれず、継承されたコントローラーコンストラクターから設定され、子コントローラーのコンストラクターのlinqクエリに渡されて、この不可思議なエラーがスローされるという同じ問題がありました。
Shawson、2017年

3
このエラーが発生する理由は、Lambdaが内部で何らかのリフレクションを行っており、オブジェクトのメソッド/プロパティを呼び出そうとしているが、オブジェクトが渡されていないため、メソッドを呼び出そうとしているためだと思います/ propertyは静的ですが、最終的には静的ではないことがわかります。これが、オブジェクトメッセージのインスタンスに設定されていないプレーンな古いオブジェクト参照を取得しない理由です。
メルボルンデベロッパー

最初の文を読むだけで問題を解決できます
アントワーヌペルティエ

33

通常、ターゲットがnullの場合に発生します。したがって、最初にinvokeターゲットを確認してから、linqクエリを実行してください。


5
私の場合、それはwhere句のnull参照例外でした
BraveNewMath 2015

12

すべてのナビゲーションプロパティを解決するDBContextを介してではなく、手動でエンティティをインスタンス化すると、Entity Frameworkでこの問題が蔓延することがわかりました。テーブル間に外部キー参照(ナビゲーションプロパティ)があり、ラムダでそれらの参照を使用している場合(例:ProductDetail.Products.ID)、エンティティを手動で作成した場合、その「製品」コンテキストはnullのままです。


2

すべての答えは、NRE(Null Reference Exception)のLambda式を指しています。Linq to Entitiesを使用するときにも発生することがわかりました。この例外はラムダ式内のNREだけに限定されないことを指摘しておくと役立つと思いました。


1

PostmanツールでWebAPIをテストすると、このエラーが発生します。

コードをビルドした後、デバッグモードで行を削除すると(例:私の場合、コメント行を1つ削除すると、このエラーが発生しました...)、「非静的メソッドにはターゲットが必要です」というエラーが発生します。

繰り返しますが、同じリクエストを送信しようとしました。今回のタイムコードは正常に動作しています。そして、私はPostmanで適切に応答を受け取ります。

私はそれが誰かに使用されることを願っています...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.