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

Mar*_*eIV 19 c# reflection subclass base-class class-members

由于此问题在这里,我想编写处理,你继承列表或集合,然后额外的属性,将其添加的情况下自定义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; }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我想反映的MySubClass,只有获得SubProp1SubProp2而忽略BaseProp1BaseProp2.所以,可以说是如何做呢?

中号

Ank*_*kur 28

在调用"GetMembers"方法来获取Type的成员时,可以在绑定标志中具体指定"DeclaredOnly".

  • 我需要使用...`type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)` (2认同)

use*_*016 10

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

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

MemberInfo[] notInherited = GetType("MySubClass").GetMembers().Where(m => m.DeclaringType == GetType("MySubClass"));
Run Code Online (Sandbox Code Playgroud)

或者GetMembers()过载:

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);
Run Code Online (Sandbox Code Playgroud)


Dam*_*ver 5

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

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