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

本文关键字:继承 方法 获取 net 可以使 反射 | 更新日期: 2023-09-27 17:54:52

由于这个问题这里,我试图编写一个自定义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。那么可以是怎么做呢?

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

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

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

对于LINQ,类似这样的东西:

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

GetMembers()过载:

MemberInfo[] notInherited = GetType("MySubClass").GetMembers(BindingFlags.DeclaredOnly);

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

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

MemberInfo.DeclaringType应该做你需要的。要获得直接在类型X中定义的成员,请使用DeclaringType == typeof(X)对成员进行筛选。

就用这个标志:

var eFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly;
X.GetMethods(eFlags)