23

由于这里的这个问题,我正在尝试编写一个自定义 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并且只得到SubProp1andSubProp2而忽略BaseProp1and BaseProp2。那怎么可能呢

4

4 回答 4

35

调用GetMembers()方法获取Type的成员时,可以DeclaredOnly在绑定标志中指定。

于 2011-05-04T08:51:07.540 回答
12

您必须选择所有成员MySubClass并仅保留DeclaringType == MySubClass.

使用 LINQ,类似的东西(矫枉过正):

MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));

GetMembers()过载:

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
于 2011-05-04T08:52:52.123 回答
4

许多反射函数接受BindingFlags类型的参数。此枚举包含一个值 DeclaredOnly:

指定只应考虑在提供的类型层次结构级别声明的成员。不考虑继承的成员。

于 2011-05-04T08:50:31.343 回答
2

MemberInfo.DeclaringType应该做你需要的。要获取直接在类型 X 中定义的成员,请按 . 过滤成员DeclaringType == typeof(X)

于 2011-05-04T08:53:03.043 回答