我正在使用反射来映射对象。这些对象在托管代码中,但除了通过反射之外,我无法看到它们的源代码、底层结构等。所有这一切的首要目标是对象的基本内存映射(在功能上类似于 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
。在这种情况下,我试图避免两次计算日期,因为这会给我一个糟糕的内存大小近似值。
更令人困惑/复杂的是,我遇到了属性并不总是具有将通过该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
是属性的支持字段,但FirstChar
字符串Length
的实际内容保存在字符属性中。这是一个索引属性,可以对其进行索引以返回字符串中的所有字符,但我找不到保存字符串字符的相应字段。关于为什么会这样的任何想法?或者如何获取索引属性的支持字段?