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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> возможно ли получить значение проперти, если есть её название в string 
V
    Опции темы
Kefir
Дата 27.6.2007, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



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

class x
{
  public int var;
}

и есть переменная а-ля string class_member = "var";

требуется: получить значение x.var через class_member. то есть что-нибудь а-ля x.getProperty(class_member); (ну это я условно написал).
PM MAIL WWW Skype   Вверх
tol05
Дата 27.6.2007, 11:46 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



Код

class x
{
  private int var;

  public int VAR
  {
    get{return var;}
    set{var = value;}
  }

  private static int var1;

  public static int VAR1
  {
    get{return var1;}
    set{var1 = value;}
  }
}

x myX = new x();
int a = myX.VAR;
string s = myX.VAR.ToString();

int a1 = x.VAR1;
string s1 = x.VAR1.ToString();



Может книжку по шарпу почитаешь?   smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Kefir
Дата 27.6.2007, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



книжку по шарпу читаю. а тебе могу посоветовать почитать мой вопрос ещё раз smile 

ещё раз. есть класс. есть название его поля/свойства в строковой переменной. мне надо получить значение этого поля/свойства именно через его название в строковой переменной (т.е. не просто x.MyProperty, a x.getProperty("MyProperty")).
PM MAIL WWW Skype   Вверх
anthony
Дата 27.6.2007, 12:20 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Общее решение поиска поля в классе по его имени (речь идет о поиске поля, но не свойства или метода). Для поиска свойств и методов нужно использовать соответствующие функции класса Type. Параметры BindingFlags определяют ограничения поиска (например, только видимые, относящиеся к экземпляру класса и так далее).

Код

namespace TestReflection {

    using System;
    using System.Reflection;

    class x {
        public int var;
    }

    class Program {
        static void Main ( string [ ] args ) {

            x xInstanceFirst = new x ( );
            x xInstanceSecond = new x ( );
            xInstanceFirst.var = 32;
            xInstanceSecond.var = 64;

            string class_member = "var";

            FieldInfo [ ] fields = typeof ( x ).GetFields ( BindingFlags.Instance | BindingFlags.Public );
            foreach ( FieldInfo fieldInfo in fields ) {
                if ( fieldInfo.Name.Equals ( class_member ) ) {
                    Console.WriteLine ( fieldInfo.GetValue ( xInstanceFirst ).ToString ( ) );
                    Console.WriteLine ( fieldInfo.GetValue ( xInstanceSecond ).ToString ( ) );
                }
            }
        }
    }
}


Решение, соответствующее поставленной задаче.

Код

namespace TestReflection {

    using System;
    using System.Reflection;

    class x {

        public string getProperty ( string class_member ) {
            FieldInfo [ ] fields = this.GetType ( ).GetFields ( BindingFlags.Instance | BindingFlags.Public );
            foreach ( FieldInfo fieldInfo in fields ) {
                if ( fieldInfo.Name.Equals ( class_member ) ) {
                    return fieldInfo.GetValue ( this ).ToString ( );
                }
            }
            return string.Empty;
        }

        public int var;
    }

    class Program {
        static void Main ( string [ ] args ) {

            x xInstanceFirst = new x ( );
            x xInstanceSecond = new x ( );
            xInstanceFirst.var = 32;
            xInstanceSecond.var = 64;

            string class_member = "var";

            Console.WriteLine ( xInstanceFirst.getProperty ( class_member ) );
            Console.WriteLine ( xInstanceSecond.getProperty ( class_member ) );
        }
    }
}


В общем случае метод getProperty должен возвращать object (в примере показано string), тогда если необходимое свойство не найдено в классе, то может возвращаться нулевой объект (либо генерироваться исключение).

Это сообщение отредактировал(а) anthony - 27.6.2007, 12:52
PM MAIL ICQ   Вверх
tol05
Дата 27.6.2007, 12:27 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



ясно. Извини.  smile  Рефлексия тогда
Код

string propertyName = "VAR";
x myX = new x();
myX.VAR = 10;


Type t = myX.GetType();
int pi = (int)t.InvokeMember(propertyName, BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic |
                                BindingFlags.Instance | BindingFlags.GetProperty, null, myX, null);

Код

class x
    {
        private int var;

        public int VAR
        {
            get { return var; }
            set { var = value; }
        }
    }

ну, теперь оно?  smile 


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Kefir
Дата 27.6.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


«Hakuna Matata»
***


Профиль
Группа: Комодератор
Сообщений: 1878
Регистрация: 25.1.2003
Где: Tampere, Suomi

Репутация: 2
Всего: 87



а, собственно, есть разница между двумя этими решениями? второе как-то приятнее выглядит (компактнее и проще).

а вообще спасибо за внимание и за решения. помечаю вопрос решённым.
PM MAIL WWW Skype   Вверх
tol05
Дата 27.6.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 63
Всего: 170



anthony предложил вариант через FieldInfo - это класс, предоставляющий инфу только о полях типа
можно через MemberInfo - универсальное средство, инфа о любом члене типа. 
Ну а я - внаглую, через System.Type   Напролом. smile
Посмотри System.Reflection - рефлексия, гибкая вещь (как и многое другое в .Net), можно разными вариантами работать...



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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