由于这个问题here,我正在尝试编写一个自定义JsonConverter来处理您对列表或集合进行子类化的情况,然后为其添加额外的属性。因此,一种方法是忽略所有基类属性,并仅序列化已定义类中的属性。 (从技术上讲这不会起作用,因为如果你继承了那个子类,你就会破坏序列化,但它确实让我想知道......)
是否有可能通过反射(我知道答案是'是',因为Reflector正是如此,但我不知道如何)只获得在类本身上定义的成员而不是那些遗传?例如......
public class MyBaseClass
{
public string BaseProp1 { get; set; }
public string BaseProp2 { get; set; }
}
public class MySubClass : MyBaseClass
{
public string SubProp1 { get; set; }
public string SubProp2 { get; set; }
}
在这种情况下,我想反思MySubClass
并且仅在忽略SubProp1
和SubProp2
时获取BaseProp1
和BaseProp2
。所以可以怎么做?
中号
答案 0 :(得分:26)
在调用“GetMembers”方法获取Type的成员时,您可以在绑定标志中指定“DeclaredOnly”。
答案 1 :(得分:10)
您必须选择MySubClass
中的所有成员,并且只保留DeclaringType == MySubClass
中的所有成员。
使用LINQ,类似的东西(矫枉过正):
MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
或GetMembers()
重载:
MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
答案 2 :(得分:3)
许多反射函数接受BindingFlags类型的参数。此枚举包含值DeclaredOnly:
指定只应考虑在提供的类型层次结构级别声明的成员。不考虑继承的成员。
答案 3 :(得分:1)
MemberInfo.DeclaringType
应该做你需要的。要在X类型中直接定义成员,请按DeclaringType == typeof(X)
过滤成员。