Генерация кода для свойства struct пользовательского элемента управления - PullRequest
0 голосов
/ 26 февраля 2019

Я создаю пользовательский элемент управления, как показано ниже:

public partial class TestControl : UserControl
{
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
    public State MyState
    {
        get { return new State(this); }
    }

    internal int[] _internalStates;

    [TypeConverter(typeof(ExpandableObjectConverter))]
    public struct State
    {
        private TestControl _myControl;
        public State(TestControl _) { _myControl = _; }
        public int Data
        {
            get { return _myControl._internalStates[0]; }
            set { _myControl._internalStates[0] = value; }
        }
    }
}

Затем я могу перетащить элемент управления из панели инструментов и изменить значение Data в конструкторе.

property

Проблема в том, что дизайнер сгенерирует этот код в методе InitializeComponent:

this.testControl1.MyState.Data = 0;

Но эта строка выдаст ошибку:

Невозможно изменить возвращаемое значение «TestControl.MyState», поскольку оно не является переменной

Я понимаю, почему утверждение является ошибкой, вопрос как я могу управлять генерацией кода чтобы исправить ошибку, например, чтобы сгенерировать подобный код?

var myState = this.testControl1.MyState;
myState.Data = 0;

Дополнительная информация

  • State struct - это просто мост для изменениявнутреннее свойство в TestControl

  • Поэтому я хочу сохранить State как структуру, чтобы избежать накладных расходов GC.

  • Причинане определите свойство в TestControl классе, если в классе несколько состояний, и состояние будет содержать несколько свойств, поэтому янеобходимо обернуть методы модификации, а не определять множество свойств в классе TestControl.

1 Ответ

0 голосов
/ 26 февраля 2019

Почему ошибка времени компиляции для Control.StructProperty.Member = Value;?

Рассмотрим следующее утверждение

this.Control.StructProperty.Value = 0;

StructProperty - это свойство, поэтому сначала его получатель получитвыполнить, и, поскольку это структура и тип значения, она вернет копию структуры, и установка свойства для этой копии бесполезна / не работает.Он хорошо знает ситуацию и вместо компиляции сбивающего с толку нерабочего кода генерирует Ошибка компилятора CS1612 :

Невозможно изменить возвращаемое значение выражения, поскольку ононе переменная

Как создать рабочий код для свойства Struct?

Возможно, вы заметили, что нельзя присвоить this.Size.Width = 100 с тем жепричина.И способ, которым эта форма генерирует код для свойства Size:

this.Size = new Size(100,100);

Вы также можете сгенерировать код для свойства таким же образом, реализовав дескриптор типа, производный от TypeConverter, возвращая InstanceDescriptor в методе ConvertTo для генерации кода для вашего свойства структуры с использованием параметрического конструктора, который вы должны иметь для структуры.

В общем, я предлагаю использовать классы, а не структурыза такую ​​недвижимость.

...