5

私が持っているJavaのように:

Class.getSuperClass().getDeclaredFields()

スーパークラスからプライベートフィールドを知り、設定するにはどうすればよいですか?

これが強く推奨されないことはわかっていますが、アプリケーションをテストしていて、ID が正しくて名前が正しくないという間違った状況をシミュレートする必要があります。ただし、この ID は非公開です。

4

4 に答える 4

9

はい、リフレクションを使用して、コンストラクターの実行後に読み取り専用フィールドの値を設定できます

var fi = this.GetType()
             .BaseType
             .GetField("_someField", BindingFlags.Instance | BindingFlags.NonPublic);

fi.SetValue(this, 1);

編集

直接の親タイプを参照するように更新されました。タイプがジェネリックである場合、このソリューションには問題がある可能性があります。

于 2009-09-09T19:09:33.683 に答える
1

このクラスはあなたにそれをさせます:

http://csharptest.net/browse/src/Library/Reflection/PropertyType.cs

使用法:

new PropertyType(this.GetType(), "_myParentField").SetValue(this, newValue);

ところで、パブリック/非パブリックのフィールドまたはプロパティで機能します。使いやすくするために、派生クラスPropertyValueを次のように使用できます。

new PropertyValue<int>(this,  "_myParentField").Value = newValue;
于 2009-09-09T19:05:58.253 に答える
1

はい、できます。

フィールドにはFieldInfoクラスを使用します。パラメータを使用すると、BindingFlags.NonPublicプライベート フィールドを表示できます。

public class Base
{
    private string _id = "hi";

    public string Id { get { return _id; } }
}

public class Derived : Base
{
    public void changeParentVariable()
    {
        FieldInfo fld = typeof(Base).GetField("_id", BindingFlags.Instance | BindingFlags.NonPublic);
        fld.SetValue(this, "sup");
    }
}

そして、それが機能することを証明するための小さなテスト:

public static void Run()
{
    var derived = new Derived();
    Console.WriteLine(derived.Id); // prints "hi"
    derived.changeParentVariable();
    Console.WriteLine(derived.Id); // prints "sup"
}
于 2009-09-09T19:11:10.323 に答える
0

JaredPar が示唆するように、私は次のことを行いました。

//to discover the object type
Type groupType = _group.GetType();
//to discover the parent object type
Type bType = groupType.BaseType;
//now I get all field to make sure that I can retrieve the field.
FieldInfo[] idFromBaseType = bType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance);

//And finally I set the values. (for me, the ID is the first element)
idFromBaseType[0].SetValue(_group, 1);

ありがとうございます。

于 2009-09-09T20:47:53.680 に答える