在.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
,只得到SubProp1
和SubProp2
,而忽略BaseProp1
和BaseProp2
。那么可以是怎么做呢?
调用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)