Domanda

come in Java ho:

Class.getSuperClass().getDeclaredFields()

come posso sapere e impostare il campo privato da una superclasse?

So che questo non è fortemente raccomandato, ma sto testando la mia applicazione e ho bisogno di simulare una situazione sbagliata in cui l'id è corretto e il nome no. Ma questo ID è privato.

È stato utile?

Soluzione

Sì, è possibile utilizzare reflection per impostare il valore di un campo di sola lettura dopo l'esecuzione del costruttore

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

fi.SetValue(this, 1);

Modifica

Aggiornato per cercare il tipo genitore diretto. Questa soluzione avrà probabilmente problemi se i tipi sono generici.

Altri suggerimenti

Sì, puoi.

Per i campi, utilizzare la classe FieldInfo . Il parametro BindingFlags.NonPublic consente di visualizzare i campi privati.

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");
    }
}

e un piccolo test per dimostrare che funziona:

public static void Run()
{
    var derived = new Derived();
    Console.WriteLine(derived.Id); // prints "hi"
    derived.changeParentVariable();
    Console.WriteLine(derived.Id); // prints "sup"
}

Questa classe ti consentirà di farlo:

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

Utilizzo:

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

A proposito, funzionerà su campi o proprietà pubblici / non pubblici. Per facilità d'uso è possibile utilizzare la classe derivata PropertyValue in questo modo:

new PropertyValue<int>(this,  "_myParentField").Value = newValue;

Come suggerisce JaredPar, ho fatto quanto segue:

//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);

Grazie a tutti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top