Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взять Property по его имяни у экземпляра класса 
V
    Опции темы
interv
  Дата 14.8.2012, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



Допустим есть класс
Код

class A
{
  protected string m_p1 = "Une";
  protected int m_p2 = 1;
  protected bool m_p3 = true;
  public A(){}
  public string p1 { get{return m_p1;} }
  public int p2 { get{return m_p2;} }
  public bool p3 { get{return m_p3;} }
}

допустим есть строка "string b" которая может быть "p1", "p2", "p3" или какая-то нестандартная
как мне получить значение свойства экземпляра класса "A"в виде object, зная строку "b" 
пример:
Код

A a = new A();
object ret
ret = anyfunction(a, "p1"); //Вернет "Une"
ret = anyfunction(a, "p2"); //Вернет 1
ret = anyfunction(a, "p3"); //Вернет true
ret = anyfunction(a, "p4"); //Вернет null


Это сообщение отредактировал(а) interv - 15.8.2012, 08:25
PM MAIL   Вверх
IBS
Дата 14.8.2012, 10:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: 1
Всего: 6



Не, так не получится. Но можно для таких целей использовать Dictionary
Код

var dic = new Dictionary<string,object>();
dic.Add("p1","Une");
dic.Add("p2",1);
....

object ret  = dic["p1"];

PM MAIL   Вверх
interv
Дата 14.8.2012, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



Не вариант, надо получать по имяни значения не иначе.
PM MAIL   Вверх
IBS
Дата 14.8.2012, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: 1
Всего: 6



Код

class A
{
  public Dictionary<string,object> diс; 
  public A()
      {
            var dic = new Dictionary<string,object>();
            dic.Add("p1","Une");
            dic.Add("p2",1);
            ....
       }

}


Ну тока так) А вообще интересно где такое может понадобиться? можно пример поконкретнее, вдруг варианты получше есть?
PM MAIL   Вверх
interv
Дата 14.8.2012, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



ок. Есть объект со свойствами, его трогать низя.
Есть форма в ней есть некоторая функция PrepareControls.
Код

        protected struct ControlLinkDB
        {
            public string property;
            public Control control;
        }

        protected List<ControlLinkDB> m_Controls = new List<ControlLinkDB>();
        protected PCL_Object m_object = null;

        protected void PrepareControls()
        {
            for (int i = 0; i < m_Controls.Count; ++i)
            {
                Control control = m_Controls[i].control;
                if (control is TextBox)
                {
                    TextBox tb = (control as TextBox);
                    tb.Text = m_object.GetType().GetField(m_Controls[i].property).GetValue(m_object).ToString();
                }
            }
        }


Она заполняет данные на форме в контролы беря значения из объекта m_object.
и да, вы правы строчка tb.Text = m_object.GetType().GetField(m_Controls[i].property).GetValue(m_object).ToString(); выдает ошибку

еще забыл, несколько форм наследуются от текущей и обрабатывают данные свойств объектов наследующихся от PCL_Object

Это сообщение отредактировал(а) interv - 14.8.2012, 12:19
PM MAIL   Вверх
IBS
Дата 14.8.2012, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 214
Регистрация: 29.7.2008
Где: Белоруссия

Репутация: 1
Всего: 6



В студии не проверял, но должно работать:

Код

var textBoxes = m_Controls.OfType<TextBox>().Select(x=>(TextBox) x);
forech (var texBox in textBoxes)
            {
                   //А теперь просто соответствующему textBox-у ставим в соответствие соответствующее поле класса
                    switch(texBox .Name)
                    {
                         case "TextBoxName": //Такое-то поле
                              break;
                          .......
                     }
                }


Это сообщение отредактировал(а) IBS - 14.8.2012, 13:16
PM MAIL   Вверх
interv
Дата 15.8.2012, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



Не совсем подходит, у меня в корневом классе, который наследуется от window есть 2-3 метода в которых обрабатывается список контролов, но список этот заполняеться у наследников, поэтому Switch не подойдет т.к. корневой класс изначально не знает список контролов для обработки. Делается это для уменьшение копипаста кода в проекте, т.к. наследников будет немерено.

Вот пример методов в корневом классе 

protected void PrepareControls(); //Заполняет контролы значением из объекта PCL_Object
protected void ApplyControl(); // Проверяет соответствие значений в объекте и контроле, при их различии делает UPDATE в бд
protected void OkControl(); // Тоже что и Apply только закрывает форму
protected void onChange(); // Обработчик для контролов у которых есть соответствие с полями объекта PCL_Object

Как видите мне необходимо создавать немерено наследников формы для обработки немереного количества наследников PCL_Object
В каждой форме писать заполнение, проверки, обработчики это жесть, темболее их потом править... Вместо этого я заполняю в наследниках формы protected List<ControlLinkDB> m_Controls = new List<ControlLinkDB>(); а функция PrepareControls() ставит значения из объектов на форму

Насколько я понимаю есть только один выход - писать абстрактный метод public object getProperty(string nameProperty) у класса PCL_Object, который переопределять в классах наследника...

Это сообщение отредактировал(а) interv - 15.8.2012, 07:43
PM MAIL   Вверх
diadiavova
Дата 15.8.2012, 10:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Цитата

m_object.GetType().GetField(m_Controls[i].property).GetValue(m_object).ToString();?
А почему гетфилд, а не гетпроперти? 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
interv
Дата 15.8.2012, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 24.1.2012

Репутация: нет
Всего: 4



А вот фиг знает че я так тупанул )
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0867 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.