4

次のコードを実行すると、MethodInfo/ FieldInfo/etc のみが返されます。それは、私が情報オブジェクトを検索している に直接属してTypeいます。基本クラスに存在し、プライベートである可能性があるという事実に関係なく、情報オブジェクトを見つけるにはどうすればよいですか?

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

3 に答える 3

3

さて、あなたはあなた自身の質問に答えましたが、私が理解している限り、あなたの主な要件は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 回表示されることに注意してください。クラスで定義されている およびその他のメソッドにも注意してくださいMyClassNameToStringGetTypeobject

于 2013-03-29T21:22:13.687 に答える
1

次のコードは、子クラスに情報オブジェクトが見つからない場合、オブジェクトの各基本クラスを調べます。基本クラスの情報オブジェクトを返しますが、「最初に実行される」オブジェクトを返すことに注意してください。したがって_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;
}
于 2013-03-29T21:13:36.340 に答える