Frage

wie in Java Ich habe:

Class.getSuperClass().getDeclaredFields()

Wie kann ich wissen und privaten Bereich von einer übergeordneten Klasse gesetzt?

Ich weiß, das stark nicht zu empfehlen ist, aber ich meine Bewerbung mich entschieden, und ich brauche eine falsche Situation zu simulieren, wo die ID korrekt ist und der Name nicht. Aber diese Id ist privat.

War es hilfreich?

Lösung

Ja, ist es möglich, Reflexion zu verwenden, um den Wert eines Nur-Lese-Feldes zu setzen, nachdem der Konstruktor ausgeführt wird

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

fi.SetValue(this, 1);

Bearbeiten

Aktualisiert in dem direkten Muttertyp zu suchen. Diese Lösung wird wahrscheinlich Probleme, wenn die Typen sind generisch.

Andere Tipps

Ja, Sie können.

Für Felder, verwenden Sie die FieldInfo Klasse. Der BindingFlags.NonPublic Parameter können Sie private Felder sehen.

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

und ein kleiner Test, es zu beweisen funktioniert:

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

Diese Klasse lässt Sie es tun:

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

Verbrauch:

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

BTW, es wird auf dem öffentlichen Arbeit / nicht-öffentlichen Bereichen oder Eigenschaften. Für einfache Bedienung können Sie die abgeleitete Klasse Property wie folgt aus:

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

Wie JaredPar schon sagt, ich habe die folgen:

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

Danke an alle.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top