質問: typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public).Where(x => x.GetSetMethod().IsVirtual && !x.PropertyType.IsPrimitive); foreach (var propInfo in virtualProperties) { propInfo.SetValue(obj, null); // This Line is the culprit. } GetJsonSerializer().Serialize(obj, stringBuilder); return stringBuilder.ToString(); } ``` 私がループの前にブレークポイントを1つずつ(またはその行をブレークする`propInfo.SetValue(obj, null)`だけ実行すると`propInfo.SetValue(obj, null)`という行が実行されますが、ブレークポイントを使用しないとプロパティは決して設定されませんies)をnullにします。どうしてこれなの? **特定の詳細** : * 私がブレークポイントを使用しない場合、動作しません。 * 私がforeachの上にブレークポイントを置き、f5を押すと動きません。 * 私がforeachの最上部にブレークポイントを置き、f10を介してステップスルーすると機能します。 * コードの行にブレークポイントを配置すると、 `propInfo.SetValue(obj, null);`それは動作します。 * ループの後のブレークポイントは、値がnullでないとしても表示されます。 * `null`を`5` (有効な値ではない)に変更すると、有効な値ではないことを示す例外がスローされます。 明確にするために、 *「機能しません」*とは、プロパティをnullに設定しないことを意味します。 **私が試したこと:** * Visual Studio(2013)を再起動する * コード行の変更( `default(T)` ) * プロジェクトのプロパティ - >ビルド - >コードの最適化(最初はオフ) **EDIT** EFナビゲーションプロパティがこの動作の原因であることが絞り込まれています。コードが実行されていますが、何らかの理由でナビゲーションプロパティがnullになることを拒否しています。では、ナビゲーションのプロパティがこの動作を引き起こしていますか?
回答: **レイジーロード** ナビゲーションプロパティはレイジーローディングだったので、シリアライザがそれらを見たときに元の値で上書きされました。だから、nullの設定はずっと働いていましたが、遅延ロードによって上書きされていました。 **デバッグ** 私がSetValue行のコードを実行する前に値を調べていたので、デバッグが現れたのはその理由でした。これにより、コード行を実行する前に値をロードして、ヌル値が上書きされないナビゲーションプロパティが発生しました。 **溶液** ``` foreach (var propInfo in virtualProperties) { propInfo.GetValue(obj); // Trigger any navigation property to load. propInfo.SetValue(obj, null); } ```