Подтвердить что ты не робот

Есть ли способ установить свойства на экземплярах структуры с помощью отражения?

Я пытаюсь написать код, который устанавливает свойство в struct (важно, что это свойство в структуре), и он не работает:

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

Значение высоты (как сообщается отладчиком) никогда не устанавливается ни на что: оно остается на значении по умолчанию 0.

Я уже много раз размышлял над классами, и это сработало хорошо. Кроме того, я знаю, что при работе с structs вам нужно использовать FieldInfo.SetValueDirect, если вы устанавливаете поле, но я не знаю об эквиваленте для PropertyInfo.

4b9b3361

Ответ 1

Значение rectangle помещается в бокс - но тогда вы теряете значение в коробке, которое является тем, что изменяется. Попробуйте следующее:

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

Ответ 2

Когда-либо слышал о SetValueDirect? Там была причина, по которой они это сделали.:)

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
    }
}

Существуют и другие методы, чем недокументированные __makeref, которые вы могли бы использовать (см. System.TypedReference), но они более болезненны.