C#reflection:获取类和基类的所有成员的信息

当我运行以下代码时,它只返回一个MethodInfo / FieldInfo / FieldInfo 它直接属于我正在搜索信息对象的Type 。如何查找信息对象,而不管它是否存在于基类中并且可以是私有的?

 obj.GetType().GetMethod(methodName, bindingFlags); 

好吧,你回答了自己的问题,但据我所知,你的主要要求是How do I find the info object regardless of where it is found in the hierarchy?

这里不需要递归来获取完整层次结构中的所有成员。 您可以在Type上使用GetMembers函数,它将返回包括所有基类在内的所有成员。

下一个代码示例演示如下:

 var names = typeof(MyClass).GetMembers() .Select (x => x.Name); Console.WriteLine (string.Join(Environment.NewLine, names)); 

对于这种结构

 class MyClass : Base { public string Name { get; set; } public string Surname { get; set; } } class Base { public string Name { get; set; } } 

回报

 get_Name set_Name get_Surname set_Surname get_Name set_Name ToString Equals GetHashCode GetType .ctor Name Surname 

请注意,auto-property的get_Name访问器出现两次,因为MyClass隐藏了基类的Name属性。 还要注意ToStringGetType和其他方法,在object类中定义

如果在子类中找不到info对象,则以下代码将查看对象的每个基类。 请注意,尽管它将返回基类信息对象,但它将返回它“先运行”的对象,因此如果您的子类中有一个名为_blah的变量,并且基类中有一个名为_blah的变量,那么_blah将从子类返回。

 public static MethodInfo GetMethodInfo(this Type objType, string methodName, BindingFlags flags, bool isFirstTypeChecked = true) { MethodInfo methodInfo = objType.GetMethod(methodName, flags); if (methodInfo == null && objType.BaseType != null) { methodInfo = objType.BaseType.GetMethodInfo(methodName, flags, false); } if (methodInfo == null && isFirstTypeChecked) { throw new MissingMethodException(String.Format("Method {0}.{1} could not be found with the following BindingFlags: {2}", objType.ReflectedType.FullName, methodName, flags.ToString())); } return methodInfo; } public static FieldInfo GetFieldInfo(this Type objType, string fieldName, BindingFlags flags, bool isFirstTypeChecked = true) { FieldInfo fieldInfo = objType.GetField(fieldName, flags); if (fieldInfo == null && objType.BaseType != null) { fieldInfo = objType.BaseType.GetFieldInfo(fieldName, flags, false); } if (fieldInfo == null && isFirstTypeChecked) { throw new MissingFieldException(String.Format("Field {0}.{1} could not be found with the following BindingFlags: {2}", objType.ReflectedType.FullName, fieldName, flags.ToString())); } return fieldInfo; }