0

次のコードがあります。

 ClassName class = new ClassName();

 var getValue = GetPrivateProperty<BaseClass>(class, "BoolProperty");

 public static T GetPrivateProperty<T>(object obj, string name)
    {
        BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
        PropertyInfo field = typeof(T).GetProperty(name, flags);
        return (T)field.GetValue(obj, null);
    }

returnステートメントでInvalidCastExceptionを取得すると、System.Boolean型のオブジェクトをClassName型に変換できません。BaseClass にはプロパティがあります。ClassName は BaseClass を継承しています。「ClassName」クラスからすべてのプロパティにアクセスする必要があります。このプロパティはプライベートであるため、BaseClass を介して直接アクセスする必要があります。これは機能しますが、プロパティの戻り値がブール値であるため、クラッシュします。

ありがとう!

4

1 に答える 1

1

タイプのプロパティを取得しましたがT、戻り値もタイプT?である必要があります。私はそれを信じていません。

たぶんこれが役立ちます:

var getValue = GetPrivateProperty<bool>(class, "BoolProperty");

public static T GetPrivateProperty<T>(object obj, string name)
{
    BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
    PropertyInfo field = null;
    var objType = obj.GetType();
    while (objType != null && field == null)
    {
        field = objType.GetProperty(name, flags);
        objType = objType.BaseType;
    }

    return (T)field.GetValue(obj, null);
}

<BaseClass><bool>typeof(T).GetProperty~の変化をご覧くださいobj.GetType().GetProperty

于 2015-11-11T10:11:49.173 に答える