Есть ли способ установить свойства в экземплярах структуры с помощью отражения? - PullRequest
47 голосов
/ 08 июня 2011

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

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

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

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

Ответы [ 2 ]

67 голосов
/ 08 июня 2011

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

Rectangle rectangle = new Rectangle();
PropertyInfo propertyInfo = typeof(Rectangle).GetProperty("Height");
object boxed = rectangle;
propertyInfo.SetValue(boxed, 5, null);
rectangle = (Rectangle) boxed;
14 голосов
/ 08 июня 2011

Когда-нибудь слышали о 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), но они более болезненны.

...