Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 14

Получение значения по имени свойства класса

26.12.2014, 08:47. Показов 6312. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Мне необходимо реализовать, чтобы можно было получить значение свойства класса указав путь до него в строке. Сделать для свойств не масивов легко.
Подскажите как мне обратиться к элементу из массива, зная его имя и порядковый номер.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
 
namespace DemoApp
{
    public class C1
    {
        private List<C2> objects;
        public C2[] Objects
        {
            get { return objects.ToArray();         }
            set { objects = new List<C2>(value);    }
        }
        public void Init()
        {
            objects = new List<C2>();
            objects.Add(new C2 { 
                                    Name            = "Name", 
                                    Description     = "Description"
                               } );
        }
    }
    public class C2
    {
        public string Name          { get; set; }
        public string Description   { get; set; }
    }
    class Program
    {
        static void Main(string[] args)
        {
            string  set = "Objects";
            C1      obj = new C1();
            obj.Init();
 
            PropertyInfo prop   = obj.GetType().GetProperty(set);
            Object obg          = prop.GetValue(obj, null);
            //на следующей строке сплывает ошибка при работе (Индекс находился вне границ массива.)
            String idx          = ((DefaultMemberAttribute)obg.GetType().GetCustomAttributes(typeof(DefaultMemberAttribute),true)[0]).MemberName;
            PropertyInfo pi2    = obg.GetType().GetProperty(idx);
            Object value        = pi2.GetValue(obg, new Object[] { 0 });
 
            Console.WriteLine(((C2)value).Name);
            Console.ReadKey();
        }
    }
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
26.12.2014, 08:47
Ответы с готовыми решениями:

Получение полного имени свойства объекта
Ситуация следующая. Необходимо получить ПОЛНОЕ имя любого свойства из класса namespace ConsoleApp1 { public class SuperClass2 ...

Получение значения атрибута класса по его имени
Здравствуйте. Допустим у меня есть объект: Object MyObj; И допустим я точно знаю что значение объекта - элемент одного из трех...

Получение свойства из родительского класса
Добрый день, помогите разобраться с ошибкой. Хочу получить значение $pdo из родительского класса в дочерний, ошибка: SQLSTATE Unknown...

4
 Аватар для mbean
46 / 42 / 14
Регистрация: 18.02.2012
Сообщений: 82
26.12.2014, 17:24
У массивов нет атрибута DefaultMemberAttribute. Выйти из этой ситуации можно только приведением типа, или используя InvokeMember.
0
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 14
27.12.2014, 12:15  [ТС]
С привидением типов получается все просто, но только это в примере у меня один вид дочерних классов, а в реальной задаче у меня есть несколько разных подклассов, реализующие один интерфейс. И как привести в этом случае?

С методом InvokeMember не разобрался пока.

Добавлено через 29 минут
Хотя вровроде разобрался как не брать во внимание свой тип данных, но для этого необходимо предварительно привести переменную obg к типу object[], т.е. к массиву
0
 Аватар для mbean
46 / 42 / 14
Регистрация: 18.02.2012
Сообщений: 82
27.12.2014, 15:12
Лучший ответ Сообщение было отмечено pobdepPlus как решение

Решение

Именно про приведение к object[] или Array я и говорил.
Пример InvokeMember для массива:
C#
1
2
    int index = 0;
    Object value = obg.GetType ().InvokeMember ("Get", BindingFlags.InvokeMethod, null, obg, new object[]{index});
Для List будет попроще:
C#
1
2
    int index = 0;
    Object value = obg.GetType ().InvokeMember ("", BindingFlags.GetProperty, null, obg, new object[]{index});
1
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
27.12.2014, 16:12
C#
1
2
3
4
5
6
7
static void Main(string[] args)
{            
    C1 obj = new C1();
    obj.Init();
    Console.WriteLine(((C2[])GetPropValue(obj, "Objects"))[0].Description);
    Console.ReadKey();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.12.2014, 16:12
Помогаю со студенческими работами здесь

Получение свойства наследуемого класса
Есть класс public class BaseClass { public int MyProp { get { return 0; } } } И есть наследуемst классы

Получение Класса по имени
Как получить класс имея его имя в переменной? ухитрился найти такое Dim s = Activator.CreateInstanceFrom('путь.dll', 'класс') ...

Получение имени класса-наследника
Есть базовый класс, в нём виртуальный метод принимающий некий параметр, у класса много наследников, ни об одном из них нет никаких данных,...

Получение объекта класса по полному имени и аргументам конструктора
Существует реализация класса для создания экземпляров объектов и пока что в нём реализован (не до конца) один метод: public class...

Получение значения по текстовому имени из закрытого файла
Доброе время суток! Есть задача: в столбце прописаны имена файлов эл.таблиц (как текст), в соседних столбцах нужно получить значение...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru