次のコードを実行すると、MethodInfo
/ FieldInfo
/etc のみが返されます。それは、私が情報オブジェクトを検索している に直接属してType
います。基本クラスに存在し、プライベートである可能性があるという事実に関係なく、情報オブジェクトを見つけるにはどうすればよいですか?
obj.GetType().GetMethod(methodName, bindingFlags);
次のコードを実行すると、MethodInfo
/ FieldInfo
/etc のみが返されます。それは、私が情報オブジェクトを検索している に直接属してType
います。基本クラスに存在し、プライベートである可能性があるという事実に関係なく、情報オブジェクトを見つけるにはどうすればよいですか?
obj.GetType().GetMethod(methodName, bindingFlags);
さて、あなたはあなた自身の質問に答えましたが、私が理解している限り、あなたの主な要件はHow do I find the info object regardless of where it is found in the hierarchy?
ここでは、完全な階層内のすべてのメンバーを取得するために再帰は必要ありません。GetMembers
で関数を使用するType
と、すべての基本クラスを含むすべてのメンバーが返されます。
次のコード例は、これを示しています。
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
基本クラスのプロパティを非get_Name
表示にするため、auto-property のアクセサが 2 回表示されることに注意してください。クラスで定義されている およびその他のメソッドにも注意してくださいMyClass
Name
ToString
GetType
object
次のコードは、子クラスに情報オブジェクトが見つからない場合、オブジェクトの各基本クラスを調べます。基本クラスの情報オブジェクトを返しますが、「最初に実行される」オブジェクトを返すことに注意してください。したがって_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;
}