リフレクションを使用してオブジェクトをマッピングしています。これらのオブジェクトはマネージ コードにありますが、リフレクション以外ではソース コードや基になる構造などを確認することはできません。これらすべての包括的な目標は、オブジェクトの基本的なメモリ マップです (SOS.dllDumpObject
および!ObjSize
コマンドと同様の機能)。そのため、フィールドとプロパティの両方として「二重にカウント」されているメンバーを特定しようとしています。
例えば:
public class CalendarEntry
{
// private property
private DateTime date { get; set;}
// public field
public string day = "DAY";
}
マッピングされた場合:
- 田畑
- 日
- k__BackingField
- プロパティ
- 日にち
このようなクラスとして:
public class CalendarEntry
{
// private field
private DateTime date;
// public field
public string day = "DAY";
// Public property exposes date field safely.
public DateTime Date
{
get
{
return date;
}
set
{
date = value;
}
}
}
マッピングされた場合:
- 田畑
- 日
- 日にち
- プロパティ
- 日にち
一見すると、Date
プロパティの「バッキング フィールド」が という名前のフィールドであることはわかりませんdate
。このシナリオでは、日付を 2 回カウントしないようにしています。
さらに混乱/複雑なのは、メソッドを介してリストされる対応するフィールドが常にプロパティにあるとは限らないシナリオに遭遇したType.GetFields()
ため、すべてのプロパティを完全に無視することはできません。
から返されたコレクション内のフィールドが、Type.GetFields()
本質的に から返された対応するプロパティのバッキング フィールドであるかどうかを判断する方法についてのアイデアはありType.GetProperties()
ますか?
編集 - から返されたコレクションにリストされている対応するフィールドがプロパティにない条件を判断するのに苦労しましたType.GetFields()
。そのような条件に精通している人はいますか?
編集 2 - プロパティのバッキング フィールドが から返されるコレクションに含まれない場合の良い例を見つけましたType.GetFields()
。String のフードの下を見ると、次のようになります。
- オブジェクトには、FirstChar という名前のプロパティが含まれています
- オブジェクトには Chars という名前のプロパティが含まれています
- オブジェクトには、Length という名前のプロパティが含まれています
- オブジェクトには、m_stringLength という名前のフィールドが含まれています
- オブジェクトには、m_firstChar という名前のフィールドが含まれています
- オブジェクトには、Empty という名前のフィールドが含まれています
- オブジェクトには、TrimHead という名前のフィールドが含まれています
- オブジェクトには TrimTail という名前のフィールドが含まれています
- オブジェクトには、TrimBoth という名前のフィールドが含まれています
- オブジェクトには charPtrAlignConst という名前のフィールドが含まれています
- オブジェクトには、alignConst という名前のフィールドが含まれています
m_firstChar
とはプロパティのm_stringLength
バッキング フィールドですが、文字列の実際の内容は Chars プロパティに保持されますFirstChar
。Length
これは、文字列内のすべての文字を返すようにインデックス付けできるインデックス付きプロパティですが、文字列の文字を保持する対応するフィールドが見つかりません。その理由について何か考えはありますか?または、インデックス付きプロパティのバッキング フィールドを取得する方法は?