Динамическое получение / установка свойства объекта в C # 2005 - PullRequest
4 голосов
/ 10 февраля 2009

Я унаследовал кодовую базу и пишу небольшой инструмент для обновления базы данных для него. Код использует слой доступа к данным, такой как SubSonic (но он самодельный). Существует много свойств объекта, таких как «id», «templateFROM» и «templateTO», но их 50.

На экране я не могу отобразить все 50 свойств каждое в своем собственном текстовом поле для ввода данных, поэтому у меня есть список всех возможных свойств и одно текстовое поле для редактирования. Когда они выбирают свойство в списке, я заполняю текстовое поле значением, которому соответствует это свойство. Затем мне нужно обновить свойство после того, как они закончили редактирование.

Прямо сейчас я использую 2 огромных оператора регистра переключателей. Это кажется глупым для меня. Есть ли способ динамически сообщить C #, какое свойство я хочу установить или получить? Может быть, как:

entObj."templateFROM" = _sVal;

??

Ответы [ 6 ]

8 голосов
/ 10 февраля 2009

Вам нужно использовать System.Reflection для этой задачи.

entObj.GetType().GetProperty("templateFROM").SetValue(entObj, _sVal, null);

Это должно вам помочь.

2 голосов
/ 10 февраля 2009

Я думаю, что вы ищете, это отражение. Вот небольшой фрагмент:

Type t = entObj.GetType();
t.GetProperty("templateFROM").SetValue(entObj, "new value", null);

В большей части заметки об удобстве использования (и меньше заметки об ответе на ваш вопрос) вы можете захотеть использовать элемент управления PropertyGrid . Этот список / текстовое поле звучит так, как будто его довольно утомительно использовать.

2 голосов
/ 10 февраля 2009

То, что вы хотите, называется отражение .

1 голос
/ 10 февраля 2009

В связанной заметке ваши пользователи будут ненавидеть этот интерфейс, если им нужно будет обновить сразу много свойств Можете ли вы разделить свойства на группы или страницы, по которым пользователь может перемещаться быстрее?

1 голос
/ 10 февраля 2009
PropertyInfo[] properties = typeof(YourClass).GetProperties(BindingFlags.Instance | BindingFlags.Public)

Вы можете связать это с выпадающим списком, а затем:

PropertyInfo property = typeof(YourClass).GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public)
property.SetValue(class, textBox.Text, null);
0 голосов
/ 10 февраля 2009

Этот пример полезен

public class aa
{
    private string myVar;

    public string value
    {
        get { return myVar; }
        set { myVar = value; }
    }   
}



private void button1_Click(object sender, EventArgs e)
    {
        aa a1 = new aa();
        System.Reflection.PropertyInfo pt = typeof(aa).GetProperty("value");
        pt.SetValue(a1, "hi",null);
        this.Text = a1.value;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...