54 votes

Existe-t-il un moyen de définir des propriétés sur des instances de struct à l'aide de la réflexion?

Je suis en train d'écrire du code qui définit une propriété sur un struct (important que c'est une propriété sur une structure (struct) et il ne fonctionne pas:

System.Drawing.Rectangle rectangle = new System.Drawing.Rectangle();
PropertyInfo propertyInfo = typeof(System.Drawing.Rectangle).GetProperty("Height");
propertyInfo.SetValue(rectangle, 5, null);

La valeur de la Hauteur (tel que rapporté par le débogueur) n'est jamais fixé à quoi que ce soit - il reste à la valeur par défaut de 0.

J'ai fait beaucoup de réflexion sur les classes avant et cela a bien fonctionné. Aussi, je sais que lorsque vous traitez avec les structures, vous devez utiliser FieldInfo.SetValueDirect si la définition d'un champ, mais je ne sais pas d'équivalent pour PropertyInfo.

84voto

Jon Skeet Points 692016

La valeur de rectangle est mise en boîte - mais vous perdez alors la valeur en boîte, qui correspond à ce qui est modifié. Essaye ça:

 Rectangle rectangle = new Rectangle();
PropertyInfo propertyInfo = typeof(Rectangle).GetProperty("Height");
object boxed = rectangle;
propertyInfo.SetValue(boxed, 5, null);
rectangle = (Rectangle) boxed;
 

15voto

Mehrdad Points 70493

Jamais entendu parler de SetValueDirect ? Il y a une raison pour laquelle ils l'ont fait. :)

 struct MyStruct { public int Field; }

static class Program
{
    static void Main()
    {
        var s = new MyStruct();
        s.GetType().GetField("Field").SetValueDirect(__makeref(s), 5);
        System.Console.WriteLine(s.Field); //Prints 5
    }
}
 

Il existe d’autres méthodes que les sans-papiers __makeref que vous pouvez utiliser (voir System.TypedReference ) mais elles sont plus pénibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X