在新的 .NET Framework 4.5 中使用反射时,我遇到了一个奇怪的行为,我发现这非常出乎意料。命名空间 System.Reflection 为利用 Type 对象提供了一些新的扩展方法。其中两个是 GetRuntimeProperty(string name) 和 GetRuntimeProperties()。
现在假设您有一个具有内部属性的简单对象。
public class ObjectBase
{
protected int Id { get; set; }
public string Name { get; set; }
}
而你现在尝试利用这种类型。
var properties = typeof(ObjectBase).GetRuntimeProperties();
// properties.Count = 2
var idProperty = typeof(ObjectBase).GetRuntimeProperty("Id");
var nameProperty = typeof(ObjectBase).GetRuntimeProperty("Name");
// idProperty = null
// nameProperty = System.String Name
正如预期的那样,该properties
对象包含 Id 和 Name 属性定义的两个属性定义,而 nameProperty 包含 Name 属性定义。出乎意料的是idProperty
对象为空......
来自 .NET 框架,我猜这是 Microsoft 架构师的意图,但我必须说它看起来不像您真正期望发生的事情。我确实相信这种类似的方法应该表现相同,但似乎 GetRuntimeProperty 过滤器在 GetRuntimeProperties 不应用过滤器的公共属性上。
有人对微软为什么决定那些类似的方法应该有不同的行为有合理的解释吗?设计错误?
谢谢。