Ссылка на одну из нескольких строк в C # - PullRequest
2 голосов
/ 09 марта 2011

C # в VS2008, .NET 2.0, приложение Winforms.

Я создал небольшой класс, конструктор которого принимает ссылку на объект (который состоит из множества различных типов полей данных) и строку «ключ», которая содержит имя одного из членов строки в указанном объекте это должно быть обновлено.

В этом небольшом классе у меня есть оператор switch (), который проверяет каждое возможное допустимое значение строки «ключ» (которая может быть действительно типом enum, но неважно) и прямо там I пытаюсь назначить одну отдельную внутреннюю строковую переменную, чтобы она указывала на соответствующую строковую переменную в указанном объекте. Позже другой код обновляет эту отдельную внутреннюю переменную, и мне нужно, чтобы соответствующая переменная в указанном объекте была обновлена ​​для соответствия.

В C я бы написал что-то вроде:

char *p;
if (strcmp(pszKeyName, "FieldOne") == 0) {
    p = struct.string1;
} else if (strcmp(pszKeyName, "FieldTwo") == 0) {
    p = struct.string2;
} else if...

(Простите за синтаксис; никогда не очень хорошо разбирался в указателях.) Идея состоит в том, что я мог бы тогда просто strcpy () что-то добавить в 'p' и вуаля, соответствующая строковая переменная (string1, string2 и т. Д.) В структуре быть обновлен, чтобы соответствовать.

Как я могу сделать это в C # .NET 2.0?

В остальном это очень простой код, и я не стремлюсь ничего переклассифицировать, переопределить, получить или заново изобрести. По сути, это простой класс, представляющий один текстовый вопрос и пару флажков Да / Нет. Он используется в Winforms TabControl / TabPage для отображения метки с некоторым предопределенным текстом и позволяет пользователю нажимать «да» или «нет», чтобы ответить на заданный текст вопроса. Класс представляет только одну группу элементов управления Label / CheckBox / CheckBox; есть список <>, созданный с помощью кода вызова. (Да, я бы использовал пользовательский элемент управления для инкапсуляции трех, но вертикальная высота текста Label и, следовательно, его местоположение, неизвестны во время разработки. Это все же, возможно, стоит изучить.)

В любом случае, во время выполнения вызывающий код вычисляет, сколько из этих вопросов потребуется, основываясь на других настройках в том же большом объекте, на который ссылаются, и он создает этот маленький класс несколько раз по мере необходимости. У меня есть все экранное позиционирование и даже обработчики ..._ CheckedChanged () срабатывают при проверке CheckBox.

Последняя оставшаяся проблема заключается в том, что когда вызываются мои обработчики CheckBox «да» и «нет», они не знают, в какой из нескольких элементов данных ссылочного объекта записать слово «да» или «нет».

1 Ответ

1 голос
/ 09 марта 2011

Добавьте ссылку на System.Reflection и попробуйте это:

public void SetStringValue(object o, String propertyName, String newValue)
{
    try
    {
        o.GetType().GetProperty(propertyName).SetValue(o, newValue, null);
    }
    catch (Exception ex)
    {
        throw new Exception(String.Format("Failure setting property {0}!", propertyName), ex);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...