Отражение о структуре отличается от класса - но только в коде

После следования всем лучшим практикам, как описано в в этом посте: он по-прежнему не работает. Другое полное объяснение на сайте Telerik, однако, поставило меня на правильный путь. Проблема была вызвана контролем GMap, но могла быть вызвана любым сторонним контролем, который был разработан в другой системе. Элемент управления содержит параметр масштабирования в файле Designer.cs:

this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 16F);

Этот параметр автоматически добавляется IDE при создании нового элемента управления и основан на настройках DPI системы, в которой он создается. В системе с разрешением 96 точек на дюйм это всегда

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);

Так что все формы, которые я создал для своего приложения, имели настройку на основе 96DPI, но элемент управления GMap имел другую настройку. И когда элемент управления GMap был перерисован, это привело к масштабированию всего приложения с использованием неверных AutoScaleDimensions. Решение состоит в том, чтобы просто найти все вхождения AutoScaleDimensions и установить их все (6F, 13F).

5
задан 15 January 2009 в 22:14
поделиться

2 ответа

Работая с Вашим исходным образцом, я соглашаюсь, что он работает в C#, но не в VB! При использовании Отражателя или ILDasm, Вы будете видеть что вызов к Полю. SetValue (цель...) на самом деле компилируется (в VB) как:

field.SetValue(RuntimeHelpers.GetObjectValue(target), ...)

GetObjectValue "Возвращает помещенную в коробку копию obj, если это - класс значения; иначе сам obj возвращается". Т.е. значение устанавливается на копии Вашей структуры!

Эта ссылка дает объяснение (такое как, он). Обходное решение должно объявить цель как Систему. ValueType вместо Объекта. Я не уверен, помогает ли это на самом деле в Вашем реальном коде: Вам, возможно, понадобится грязная проверка печатания, чтобы смочь обработать типы значения отдельно от ссылочных типов.

5
ответ дан 14 December 2019 в 01:19
поделиться

Ну, Вы не показали весь свой код - в частности, где Вы устанавливаете target и как Вы проверяете значение поля впоследствии.

Вот пример, который показывает его хорошо работающий в C# хотя:

using System;
using System.Reflection;

struct Foo
{
    public int x;
}

class Test
{
    static void Main()
    {
        FieldInfo field = typeof(Foo).GetField("x");

        object foo = new Foo();
        field.SetValue(foo, 10);
        Console.WriteLine(((Foo) foo).x);
    }
}

(Я вполне уверен, выбор языка не релевантен здесь, но с большим количеством кода мы могли сказать наверняка.) Мое сильное подозрение - то, что Вы делаете что-то как:

Foo foo = new Foo();
object target = foo;
// SetValue stuff

// What do you expect foo.x to be here?

Значение foo в отрывке выше не будет изменяться - потому что на второй строке, значение копируется, когда это упаковывается. Необходимо было бы распаковать и скопировать снова впоследствии:

foo = (Foo) target;

Если это не это, покажите короткую, но полную программу, которая демонстрирует проблему.

1
ответ дан 14 December 2019 в 01:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: