Reflection in .NET

shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Reflection in .NET

Post by shadow7256 »

Туплю ужасно, никак не могу понять как достать значение следующее из иерархии классов?

Code: Select all

public class BiographicStringType
{
        private string valueField;
        public string Value 
        { 
            get { return valueField; }
            set { valueField = value; }
        }
}

public class BiographicDataType 
{
        private BiographicStringType firstNameField;

        public BiographicStringType FirstName 
        {
            get { return this.firstNameField; }
            set { this.firstNameField = value; }
        }
}

public class Person
{
     private BiographicDataType biographicsField;

     public BiographicDataType Biographics 
     {
            get { return biographicsField; }
            set { biographicsField = value; }
     }
}

var person = new Person
{
    Biographics  = new BiographicDataType 
    {
          FirstName = new BiographicStringType
          {
              Value = "Vasya";
          }
    }
}
как, зная имя property = FirstName получить его Value?

пытаюсь так

Code: Select all

var prop = person.Biographics.GetType().GetProperty("FirstName");
var value = prop.GetType().GetProperty("Value"); // вот тут null
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

от жеж неудачник :))))))

var value = prop.GetType()
ну и что должен вернуть prop.GetType(), если prop типа PropertyInfo? :)

пробуй вот так
var prop = person.Biographics.GetType().GetProperty("FirstName");
var value = prop.PropertyType.GetProperty("Value");
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

Alexandr wrote:var prop = person.Biographics.GetType().GetProperty("FirstName");
var value = prop.PropertyType.GetProperty("Value");
value это теперь объект класса String. Теперь как значение то достать?:)
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

shadow7256 wrote:
Alexandr wrote:var prop = person.Biographics.GetType().GetProperty("FirstName");
var value = prop.PropertyType.GetProperty("Value");
value это теперь объект класса String. Теперь как значение то достать?:)
Попрошу не выражаться :)
GetProperty() string возвращает? у вас там солнце сильное штоле :))))))))

value - это такой же PropertyInfo

добраться до значения просто:
string str_value = (string)value.GetValue(person.Biographics.FirstName);

но вам, для соблюдения дзен, надо сначала получить объект person.Biographics через Reflection, потом таким же макаром person.Biographics.FirstName тоже через Reflection, и уже передать вожделенный person.Biographics.FirstName в метод GetValue().
Я для краткости сократил этот путь :)
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

:-) я окончательно запутался в этом гребаном Reflection. Вы можете написать как должен выглядеть код?
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

вот у вас есть person

Code: Select all

var person = new Person
{
    Biographics = new BiographicDataType
    {
        FirstName = new BiographicStringType 
        {
            Value = "Vasya"
        }
    }
};
добраться от верхнего уровня (т.e объекта person) до значения Value можно вот так:

Code: Select all

var BiographicsInfo = person.GetType().GetProperty("Biographics");
object BiographicsObject = BiographicsInfo.GetValue(person);

var FirstNameInfo = BiographicsInfo.PropertyType.GetProperty("FirstName");
object FirstNameObject = FirstNameInfo.GetValue(BiographicsObject);

var ValueInfo = FirstNameInfo.PropertyType.GetProperty("Value");
string Value = (string)ValueInfo.GetValue(FirstNameObject);
в Value у вас будет значение "Vasya"
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

:gen1: работает :)
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

Замечание "по жизни" - не используйте "var" без особой нужды. Одно дело - когда у вас унифицированные объекты пробрасываются куда-то и затем к типу приводятся, и совсем другое, когда вы получаете нечто не типа "object", а реальный тип. Столько граблей можно избежать, работая с реальными типами. Я бы пример переписал. GetProperty возвращает PropertyInfo? Так и используйте его.

PS. Ничего личного, просто в глаза бросилось :)
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

mynameiszb wrote:Замечание "по жизни" - не используйте "var" без особой нужды.......
замечание абсолютно верное :)
это я у shadow скопипастил :))))
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

Alexandr wrote:
mynameiszb wrote:Замечание "по жизни" - не используйте "var" без особой нужды.......
замечание абсолютно верное :)
это я у shadow скопипастил :)
Я не против. Просто обычно столько всякого вылезает...

А для Reflection очень удообно еще собственные Custom Attributes пихать - тогда один раз склепав разбор, потом можно разные объекты достаточно легко модифицировать и мета-данными играться. Единственное - скорость разбора у Reflection не очень высок, поэтому желательно понимать - когда, где и как вы подобный велосипед прикручиваете.
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

mynameiszb wrote:Замечание "по жизни" - не используйте "var" без особой нужды. Одно дело - когда у вас унифицированные объекты пробрасываются куда-то и затем к типу приводятся, и совсем другое, когда вы получаете нечто не типа "object", а реальный тип. Столько граблей можно избежать, работая с реальными типами. Я бы пример переписал. GetProperty возвращает PropertyInfo? Так и используйте его.

PS. Ничего личного, просто в глаза бросилось :)
а про какие грабли Вы имеете в виду? а то везде сплошь и рядом наоборот говорят что лучше var использовать.
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

shadow7256 wrote: а про какие грабли Вы имеете в виду? а то везде сплошь и рядом наоборот говорят что лучше var использовать.
Так говорят не очень грамотные люди, имхо, которые не ковыряли большие вещи, либо только сами пишут и им не надо ревьить чужой код.
Кода у вас куча var с какого момента очень сложно отслеживать какой там тип вообще, аж в глазах рябит :)
OtherSide
Уже с Приветом
Posts: 15770
Joined: 01 Mar 2008 15:14

Re: Reflection in .NET

Post by OtherSide »

Alexandr wrote:
shadow7256 wrote: а про какие грабли Вы имеете в виду? а то везде сплошь и рядом наоборот говорят что лучше var использовать.
Так говорят не очень грамотные люди, имхо, которые не ковыряли большие вещи, либо только сами пишут и им не надо ревьить чужой код.
Кода у вас куча var с какого момента очень сложно отслеживать какой там тип вообще, аж в глазах рябит :)
+1
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

shadow7256 wrote:а про какие грабли Вы имеете в виду? а то везде сплошь и рядом наоборот говорят что лучше var использовать.
var стало модно использовать, когда народ активно начал тащить LINQ в приложения.

А в больших проектах намного лучше для рефаторинга и понимая сути кода - явно писать, что за значение получаем, как с этим типом работаем. Ну и в момент написания это чуть-чуть дисциплинирует, компиллятор вас поправит от возможных опечаток и ошибок. Это куда как лучше, чем потом в runtime получить плюху.
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Reflection in .NET

Post by katit »

А я не согласен. Ну т.е. частично не согласен. Вот в данном примере конечно да, не надо. А если в своем коде где тип не интерфейс - очень удобно. И к етому решарпер приучает :) Ну и посмотреть тип если надо (хотя обычно у меня тип видно 5-ю строками выше) можно через контекстную строку.
Лучше водки — хуже нет! ©
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

katit wrote:А я не согласен. Ну т.е. частично не согласен. Вот в данном примере конечно да, не надо. А если в своем коде где тип не интерфейс - очень удобно. И к етому решарпер приучает :) Ну и посмотреть тип если надо (хотя обычно у меня тип видно 5-ю строками выше) можно через контекстную строку.
+1 :-)
Alexandr
Уже с Приветом
Posts: 3647
Joined: 23 May 2010 15:10

Re: Reflection in .NET

Post by Alexandr »

shadow7256 wrote:
katit wrote:А я не согласен. Ну т.е. частично не согласен. Вот в данном примере конечно да, не надо. А если в своем коде где тип не интерфейс - очень удобно. И к етому решарпер приучает :) Ну и посмотреть тип если надо (хотя обычно у меня тип видно 5-ю строками выше) можно через контекстную строку.
+1 :-)
какой-там +1, двоечник :lol: , почитай тему, как ты в типах путался :)
а это всего лишь несколько строчек :) представь, что в большом проекте будет
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: Reflection in .NET

Post by shadow7256 »

:nono#: это я кто что в данном примере не стоило использовать var.
SergP
Уже с Приветом
Posts: 147
Joined: 13 Apr 2000 09:01

Re: Reflection in .NET

Post by SergP »

mynameiszb wrote:
shadow7256 wrote:а про какие грабли Вы имеете в виду? а то везде сплошь и рядом наоборот говорят что лучше var использовать.
... Ну и в момент написания это чуть-чуть дисциплинирует, компиллятор вас поправит от возможных опечаток и ошибок. Это куда как лучше, чем потом в runtime получить плюху.
Тип var переменной определяется на этапе компиляции, поэтому никаких "потом в runtime получить плюху" быть не может.
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

SergP wrote:Тип var переменной определяется на этапе компиляции, поэтому никаких "потом в runtime получить плюху" быть не может.
Здравствуйте, с чего бы это? :)

Code: Select all

    public class MyTest
    {
        public string MyString;
    }

    public class MyTestInt
    {
        public int MyInt;
    }

        public static object GetMyTest()
        {
            MyTest test = new MyTest() {MyString = "aaa"};
            return test;
        }


   ...
   var objTest = GetMyTest();
   (objTest as MyTestInt).MyInt = 0;

На момент сборки - никаких проблем. А в рантайме мы слетим. И как предлагаете это ловить?
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: Reflection in .NET

Post by katit »

Ну во первых метод обьект не должен возвращать.
А во-вторых после анбоксинга надо проверять :)

Ну и ради интереса. Как без var оно не слетит? Пример?
Лучше водки — хуже нет! ©
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

katit wrote:Как без var оно не слетит? Пример?
А без вар - у меня все методы возвращают строго типизированные объекты. Поэтому если я где-то ушами хлопаю - то еще на этапе компиляции меня рожей сунут.

Ну и для уровней абстракции - да, проверка на приведение и контракты. Правда, я зачастую чистыми типами уже не оперирую, стараюсь интерфейсы использовать.

PS. Мой поинт - не надо "var" увлекаться, чревато это.
SergP
Уже с Приветом
Posts: 147
Joined: 13 Apr 2000 09:01

Re: Reflection in .NET

Post by SergP »

mynameiszb wrote:
SergP wrote:Тип var переменной определяется на этапе компиляции, поэтому никаких "потом в runtime получить плюху" быть не может.
Здравствуйте, с чего бы это? :)

Code: Select all

    public class MyTest
    {
        public string MyString;
    }

    public class MyTestInt
    {
        public int MyInt;
    }

        public static object GetMyTest()
        {
            MyTest test = new MyTest() {MyString = "aaa"};
            return test;
        }


   ...
   var objTest = GetMyTest();
   (objTest as MyTestInt).MyInt = 0;

На момент сборки - никаких проблем. А в рантайме мы слетим. И как предлагаете это ловить?
Согласен, мое утверждение ложно для методов возвращающих object.
Но у нас за такой метод - расстрел на месте (если не предоставишь веских оснований, и я пока не могу придумать пример такого веского основания).
mynameiszb
Уже с Приветом
Posts: 1665
Joined: 16 Jul 2009 14:18
Location: Uganda

Re: Reflection in .NET

Post by mynameiszb »

SergP wrote:Но у нас за такой метод - расстрел на месте (если не предоставишь веских оснований, и я пока не могу придумать пример такого веского основания).
Иногда в самопальных фраймворках такое вижу. Хотя в правильной и красивой реализации надо все же вводить некие абстракции и через них работать, а не через object.
SergP
Уже с Приветом
Posts: 147
Joined: 13 Apr 2000 09:01

Re: Reflection in .NET

Post by SergP »

SergP wrote:
mynameiszb wrote:
SergP wrote:Тип var переменной определяется на этапе компиляции, поэтому никаких "потом в runtime получить плюху" быть не может.
Здравствуйте, с чего бы это? :)

Code: Select all

    public class MyTest
    {
        public string MyString;
    }

    public class MyTestInt
    {
        public int MyInt;
    }

        public static object GetMyTest()
        {
            MyTest test = new MyTest() {MyString = "aaa"};
            return test;
        }


   ...
   var objTest = GetMyTest();
   (objTest as MyTestInt).MyInt = 0;
На момент сборки - никаких проблем. А в рантайме мы слетим. И как предлагаете это ловить?
Согласен, мое утверждение ложно для методов возвращающих object.
Все-таки, Тип var переменной определяется на этапе компиляции, поэтому никаких "потом в runtime получить плюху" быть не может.
В Вашем примере проблема - не в var (поставьте вмесо него object - получите то же самое).
В Вашем примере проблема - в приведении типов, а это с var никак не связано.

Return to “Вопросы и новости IT”