我使用反射来绘制出对象。 这些对象是在托管代码,但我不了解其源代码,底层结构等不是通过反射其他。 所有这一切的首要目标是对象的一个基本的存储器映射(在功能上类似SOS.dll DumpObject
和!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()
。 当一个字符串的引擎盖下看你具备以下条件:
- 对象包含属性命名FirstChar
- 对象包含属性命名字符数
- 对象包含属性命名长度
- 对象包含字段命名m_stringLength
- 对象包含字段命名m_firstChar
- 对象包含字段名为空
- 对象包含字段命名TrimHead
- 对象包含字段命名TrimTail
- 对象包含字段命名TrimBoth
- 对象包含字段命名charPtrAlignConst
- 对象包含字段命名alignConst
该m_firstChar
和m_stringLength
是属性的支持领域FirstChar
和Length
,但字符串的实际内容的字符数属性举行。 这是一个可以被索引,以返回字符串中所有字符的索引属性,但我找不到持有字符串的字符的对应字段。 为什么说是有什么想法? 或如何获得索引属性的支持字段?