Puis-je modifier un champ privé hérité en lecture seule en C # en utilisant la réflexion?

StackOverflow https://stackoverflow.com/questions/1401458

Question

comme en java j'ai:

Class.getSuperClass().getDeclaredFields()

comment puis-je connaître et définir le champ privé d'une super-classe?

Je sais que cela n’est pas recommandé, mais je teste mon application et j’ai besoin de simuler une situation erronée dans laquelle l’identifiant est correct et le nom non. Mais cet identifiant est privé.

Était-ce utile?

La solution

Oui, il est possible d'utiliser la réflexion pour définir la valeur d'un champ en lecture seule après l'exécution du constructeur

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

fi.SetValue(this, 1);

MODIFIER

Mise à jour pour rechercher le type de parent direct. Cette solution aura probablement des problèmes si les types sont génériques.

Autres conseils

Oui, vous le pouvez.

Pour les champs, utilisez la classe FieldInfo . Le paramètre BindingFlags.NonPublic vous permet de voir les champs privés.

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

et un petit test pour prouver que cela fonctionne:

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

Cette classe vous permettra de le faire:

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

Utilisation:

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

BTW, cela fonctionnera sur les champs ou propriétés publics / non publics. Pour plus de facilité, vous pouvez utiliser la classe dérivée PropertyValue , comme ceci:

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

Comme le suggère JaredPar, j’ai fait ce qui suit:

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

Merci à tous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top