Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > возможно ли получить значение проперти


Автор: Kefir 27.6.2007, 11:39
допустим есть класс:
Код

class x
{
  public int var;
}

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

требуется: получить значение x.var через class_member. то есть что-нибудь а-ля x.getProperty(class_member); (ну это я условно написал).

Автор: tol05 27.6.2007, 11:46
Код

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 

Автор: Kefir 27.6.2007, 12:14
книжку по шарпу читаю. а тебе могу посоветовать почитать мой вопрос ещё раз smile 

ещё раз. есть класс. есть название его поля/свойства в строковой переменной. мне надо получить значение этого поля/свойства именно через его название в строковой переменной (т.е. не просто x.MyProperty, a x.getProperty("MyProperty")).

Автор: anthony 27.6.2007, 12:20
Общее решение поиска поля в классе по его имени (речь идет о поиске поля, но не свойства или метода). Для поиска свойств и методов нужно использовать соответствующие функции класса 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), тогда если необходимое свойство не найдено в классе, то может возвращаться нулевой объект (либо генерироваться исключение).

Автор: tol05 27.6.2007, 12:27
ясно. Извини.  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 

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

а вообще спасибо за внимание и за решения. помечаю вопрос решённым.

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)