在.NET中,您可以使用反射来获取类的所有非继承方法吗?

时间:2011-05-04 08:45:07

标签: c# reflection subclass base-class class-members

由于这个问题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并且仅在忽略SubProp1SubProp2时获取BaseProp1BaseProp2。所以可以怎么做?

中号

4 个答案:

答案 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)过滤成员。

相关问题