在.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
,只得到SubProp1
和SubProp2
,而忽略BaseProp1
和BaseProp2
。那么可以吗这是怎么做到的?
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中,你可以使用反射来获取一个类的所有非继承方法吗?的主要内容,如果未能解决你的问题,请参考以下文章