【发布时间】:2015-12-04 19:48:49
【问题描述】:
编辑:我的单元测试出错了。所以我的问题是无效的。我在下面标记了正确的答案,问题应该是“如何在继承的类上获取私有成员”。
我遍历类层次结构来获取我需要的私有成员。
我正在使用反射来获取类层次结构的成员。最初,我是分别提取属性和字段。我重构了我的代码只是为了得到MemberInfo 并开始遇到一个小问题。
最初我能够使用以下方法获取所有字段:
type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic)
这将返回类层次结构中的所有公共和私有字段。 例如关于类:
class ViewModel {
[MetaData("MetaFieldType1", typeof(Parent), null)]
public string field1;
[MetaData("MetaFieldType2", typeof(Parent), "Field Value 2")]
private string field2;
[MetaData("MetaProtectedField", typeof(Parent), "Protected Field")]
protected string pField;
protected string pField2;
[MetaData("MetaType 1", typeof(Parent), null)]
public String Prop1 { get; set; }
[MetaData("MetaType 2", typeof(Parent), "The Value")]
public String Prop2 { get; set; }
public string Field2 { get { return field2; } set { field2 = value; } }
}
class ViewModel2 : ViewModel {
public string PField { get { return pField; } set { pField = value; } }
[MetaData("MetaProtectedField2", typeof(Parent), null)]
public string PField2 { get { return pField2; } set { pField2 = value; } }
}
ViewModel 和 ViewModel2 都会返回 4 个字段
然后我更改了要使用的代码(而不是获取属性然后字段):
type.FindMembers(MemberTypes.Field | MemberTypes.Property,
BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic,
allMemberFilter,null)
在哪里
protected static readonly MemberFilter allMemberFilter = new MemberFilter(
delegate (MemberInfo objMemberInfo, Object objSearch) {
return true;
});
和ViewModel 返回所有属性和字段;但是,ViewModel2 缺少在ViewModel 中找到的私有字段(即field2)。在使用具有相同绑定标志的GetFields 和GetProperties 时,情况并非如此。
如果我将field2 更改为受保护,则它会显示在搜索中。
这是框架的问题还是我遗漏了什么?
【问题讨论】:
-
我不知道
member和field的确切定义,但我很确定基类的私有field不是继承的member类。 -
您确定
typeof (ViewModel2).GetFields(...返回4 件商品吗?我对此进行了测试,它返回了 3 个项目。 -
@YacoubMassad 你是对的,我的单元测试中有一个错误给了我这个错误。如果我想要继承类的私有成员,我将不得不遍历类层次结构。