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

Posted

技术标签:

【中文标题】在.NET中,你可以使用反射来获取一个类的所有非继承方法吗?【英文标题】:In .NET, can you use reflection to get all non-inherited methods of a class? 【发布时间】:2011-08-18 08:36:25 【问题描述】:

由于这个问题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。那么可以吗这是怎么做到的?

M

【问题讨论】:

【参考方案1】:

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

【讨论】:

我需要使用... type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.Instance)【参考方案2】:

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

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

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

或者GetMembers()重载:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

谢谢,这正是我所需要的。我正在使用 BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly;但在我添加您的修复程序之前,仍然以某种方式继承了 Object 方法。然后我注意到这不是我使用的这种性质的第一个修复程序。如果 (MethodInfo.SpecialName) 继续,我会跳过 get_XXX set_XXX 属性访问器方法;

以上是关于在.NET中,你可以使用反射来获取一个类的所有非继承方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

[C#.NET 拾遗补漏]04:你必须知道的反射

.Net C# 反射,了解只需3分钟

c# 反射

如何把一个接口的所有实现类反射出来?

Java反射

通过反射来获取对应运行时类的完整结构