С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18

Обращение к членам класса через переменную

19.02.2016, 16:12. Показов 3400. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую,

Не знаю как объяснить, в PHP это делается так:
PHP
1
2
$function_name = 'my_func';
$result = $myClass->{$function_name}();
То есть имя функции содержится в переменной, надо взять оттуда имя и обратиться к этой функции/переменной в определенном классе.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.02.2016, 16:12
Ответы с готовыми решениями:

Оператор this и обращение к членам класса
строка this->b = new B; означает взять вдресс текущего объекта b и выделить под него память?так? class B{ public: int k; ...

Обращение к элементам, членам класса
Здравствуйте! Мне нужно выполнить задания из меню (в коде программы), но я не могу понять как обраться в функции к NodeElement *cur и к...

Обращение к членам родительского шаблонного класса
Здравствуйте. Объясните, пожалуйста, почему компилятор ругается, что m_value является необъявленной переменной. template <typename...

16
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
19.02.2016, 16:15
Q_BASIC, https://msdn.microsoft.com/ru-... .110).aspx
https://msdn.microsoft.com/ru-... .110).aspx
1
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
19.02.2016, 16:26  [ТС]
А как обратиться к нему?

Добавлено через 7 минут
К примеру, надо получить значение переменной

C#
1
2
string имя_переменной = "VasyaFamily";
string result = MyClass.имя_переменной;
Должно вернуть значение MyClass.VasyaFamily;

Как в имя_переменной подставлять значения из переменной?
0
1339 / 919 / 264
Регистрация: 08.08.2014
Сообщений: 2,765
19.02.2016, 16:27
Вызов метода по имени.
C#
1
2
3
4
5
6
7
8
9
10
11
    class Program
    {
        static void Main(string[] args)
        {
            var methodName = "DoSome";
            var unit = new SomeUnit();
            var methodInfo = unit.GetType().GetMethod(methodName, 
                BindingFlags.NonPublic | BindingFlags.Instance);
            object result = methodInfo.Invoke(unit, new object[] { "text" });
        }
    }
C#
1
2
3
4
5
6
7
    class SomeUnit
    {
        private int DoSome(string par)
        {
            return string.IsNullOrEmpty(par) ? 0 : par.Length;
        }
    }
1
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
19.02.2016, 16:29
Q_BASIC, https://msdn.microsoft.com/ru-... .110).aspx
1
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
19.02.2016, 16:39  [ТС]
Так, как функцию вызывать понятно. А как значение переменной получить?

Что-то никак в гугле ничего найти не могу
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.02.2016, 16:41
Q_BASIC, тут рефлексия нужна.
http://stackoverflow.com/quest... in-c-sharp
http://stackoverflow.com/quest... -by-string
1
1339 / 919 / 264
Регистрация: 08.08.2014
Сообщений: 2,765
19.02.2016, 16:42
Q_BASIC
По той же схеме. У типа 'System.Type' есть методы не только для получения метода по имени (или списка методов), но и всей прочей информации (поля, свойства, интерфейсы), которые возвращают объекты соответствующих типов со специфичным для них функционалом.
1
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
19.02.2016, 16:43
Правда, такое довольно редко может понадобиться, зачем оно вам - непонятно.
0
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
19.02.2016, 17:02  [ТС]
Решил все папки вывести, для начала

Что-то не пошло

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
string[] result;
 
            string words = "AdminTools<>ApplicationData<>CDBurning<>CommonAdminTools<>CommonApplicationData<>CommonDesktopDirectory<>CommonDocuments<>CommonMusic<>CommonOemLinks<>CommonPictures<>CommonProgramFiles<>CommonProgramFilesX86<>CommonPrograms<>CommonStartMenu<>CommonStartup<>CommonTemplates<>CommonVideos<>Cookies<>Desktop<>DesktopDirectory<>Favorites<>Fonts<>History<>InternetCache<>LocalApplicationData<>LocalizedResources<>MyComputer<>MyDocuments<>MyMusic<>MyPictures<>MyVideos<>NetworkShortcuts<>Personal<>PrinterShortcuts<>ProgramFiles<>ProgramFilesX86<>Programs<>Recent<>Resources<>SendTo<>StartMenu<>Startup<>System<>SystemX86<>Templates<>UserProfile<>Windows";
            string[] split = { "<>" };
 
            result = words.Split(split, StringSplitOptions.RemoveEmptyEntries);
 
            foreach (string word in result)
            {
                Type _class = typeof(Environment.SpecialFolder);
                FieldInfo fieldInfo = _class.GetField(word);
 
                Console.WriteLine("GetFolderPath: {0}: {1}", word, Environment.GetFolderPath(fieldInfo.GetValue(Environment.SpecialFolder)));
            }
 
            Console.ReadKey(true);
Code
1
Environment.SpecialFolder" является тип, который недопустим в данном контексте.
0
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
20.02.2016, 17:50  [ТС]
А не подскажете как обратиться к классу из переменной?

надо взять имя класса из переменной и обратиться к нему со своим методом

variable.name = "list_2312";

{variable.name}.Add(var2);
=>
list_2312.Add(var2);
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
20.02.2016, 18:10
Q_BASIC,
C#
1
2
string className=someVariable.GetType().FullName;//Имя класса
object newVariable=Activator.CreateInstance(someVariable.GetType());//объект класса
1
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
20.02.2016, 21:16  [ТС]
В Вашем примере в someVariable уже класс. А мне надо что-бы в someVariable было имя класса (тип string)
0
22 / 25 / 11
Регистрация: 10.10.2013
Сообщений: 165
20.02.2016, 21:27
Q_BASIC,
C#
1
2
3
string className=someVariable.GetType().FullName;//Имя класса
string assemblyName=someVariable.GetType().Assembly.FullName;//имя сборки .net 
object newVariable=Activator.CreateInstance(assemblyName,className).Unwrap();//объект класса
1
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
20.02.2016, 21:40  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string className = "iName";
 
            // Надо обратиться к someFunction, которая в классе с именем из переменной className
        }
    }
 
    public static class iName
    {
        public static void someFunction(int b)
        {
            int a = b * b;
        }
    }
}
Как обратиться к iName, когда имя класса в переменной?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
20.02.2016, 21:59
C#
1
2
3
string typeName = "WF.A";
Type type = Type.GetType(typeName);
string s = (string)type.InvokeMember("Method", BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.InvokeMethod, null, null, null);
WF - пространство имен класса
A - имя класса
Класс:
C#
1
2
3
4
5
6
7
class A
{
    public static string Method()
    {
        return "Привет!";
    }
}
Добавлено через 13 минут
Применительно к примеру из #15:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
namespace ConsoleTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string className = "ConsoleTest.iName";
            int s = (int)Type.GetType(className).InvokeMember("someFunction", BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.InvokeMethod, null, null, new object[] { 30 });
            Console.WriteLine(s);
            Console.ReadKey();
        }
    }
 
    public static class iName
    {
        public static int someFunction(int b)
        {
            return b * b;
        }
    }
}
1
0 / 0 / 0
Регистрация: 10.03.2014
Сообщений: 18
20.02.2016, 22:00  [ТС]
Так, вроде как, заработало
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.02.2016, 22:00
Помогаю со студенческими работами здесь

Не могу получить доступ к членам класса через friend функцию
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; const int IDLE = 0; const int INUSE = 1; ...

Обращение к массиву не через переменную, а через константу. Возможно ли?
Интересно не ради практики, но принципа. Матрица объявляeтся как пользовательский тип. type matrix : array of byte; var a :...

Вызов метода производного класса через обращение к методу базового класса
Добрый день. Изучаю основы ООП, наткнулся на проблему. Если создавать классы внутри main.cpp, то всё нормально. Если же создавать в...

Обращение к методам класса через указатель на экземпляр класса
Добрый день. Не могу осилить проблему: Описан абстрактный класс. Описаны наследники этого класса уже без абстрактности. Описан...

Обращение к листу через переменную
День добрый, форумчане! Столкнулся вот с какой проблемой... При задании переменной через InputBox, получается обратиться через нее к...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru