С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для Yes Chad
3 / 3 / 1
Регистрация: 09.08.2020
Сообщений: 46

Конвертировать String в struct (например, string "System.Int32" в struct System.Int32)

29.08.2020, 15:58. Показов 2882. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет и здоровья! Столкнулся с некой проблемой. Мне нужно как-то конвертировать string в struct (например, string "System.Int32" в struct System.Int32). Буду признателен Вашей помощи. Спасибо! Заранее извиняюсь, если неправильно поставил суть задачи. Вот код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
string variableName = "testIntegrer";
string variable_Type;
 
//находим переменную по строке variableName и узнаем тип найденной переменной в виде строки
variable_Type = GetType().GetField(variableName).ToString();
variable_Type = variableType.Substring(0, variableType.IndexOf(' '));
 
//к примеру если тип найденной переменной int, то получим в variable_Type "System.Int32"
 
//(value это string, потому что значение я получаю из файла. поэтому необходим Parse)
string value = "54";
 
//находим переменную по строке variableName и задаем ей значение
GetType().GetField(variableName).SetValue(this, variable_Type.Parse(value));
Однако в результате я получаю ошибку: "Ошибка CS1061 'string" не содержит определения для "Parse" и не удалось найти метод расширения "Parse", принимающий тип "string" в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)."
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
29.08.2020, 15:58
Ответы с готовыми решениями:

Создание TcpChannel: не удалось привести тип объекта "System.Int32" к типу "System.String"
Всем привет! Скажите, пожалуйста, почему такая строчка не работает: TcpChannel channels = new TcpChannel(props, null, new...

Ошибка: Не удалось привести тип объекта "System.Int32" к типу "System.String"
if (Convert.ToInt32(textBox10.Text) > Convert.ToInt32(sqlreader.GetString(0).ToString()) ) Появляется такая ошибка : Не...

System.Collections.Generic.List`1[System.Int32]
Я только начал изучать c# и мне нужно создать список, в который нужно добавлять элементы, после запуска программы на месте списка...

16
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
29.08.2020, 16:20
Цитата Сообщение от Yes Chad Посмотреть сообщение
Столкнулся с некой проблемой.
В чём именно заключается сама проблема?
0
 Аватар для Yes Chad
3 / 3 / 1
Регистрация: 09.08.2020
Сообщений: 46
29.08.2020, 17:04  [ТС]
TrickyBestia, Сейчас я Вам объясню.
Допустим, если string variable_Type="System.Int32", то в "GetType().GetField(variableName).SetVal ue(this, variable_Type.Parse(_value));" вместо "variable_Type" должно быть "System.Int32".
Тоже самое если бы в string variable_Type был System.Boolean, System.Single или другой тип переменных. Проблема в том, что я не хочу дублировать код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
string variableName;
string variable_Type;
string _value;
 
variable_Type = GetType().GetField(variableName).ToString();
variable_Type = variable_Type .Substring(0, variable_Type .IndexOf(' '));
 
var getVariable = GetType().GetField(variableName);
 
//пошел дубликат кода
if (variable_Type == "System.Boolean")
        {
            getVariable.SetValue(this, System.Boolean.Parse(_value));
        }
else if (variable_Type == "System.Int32")
        {
            getVariable.SetValue(this, System.Int32.Parse(_value));
        }
else if (variable_Type == "System.Single")
        {
            getVariable.SetValue(this, System.Single.Parse(_value));
        }
Такой вариант с дубликатом кода мне не подходит.
Что Вы предложите?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.08.2020, 17:21
GetType/GetMethod/Invoke?
1
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
29.08.2020, 17:39
Yes Chad, не знаю зачем вам это, но тип можно спарсить вот так:
C#
1
Type type = Type.GetType(Console.ReadLine());
1
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
29.08.2020, 17:45
Непонятно, что в принципе нужно и зачем такой огород городить, но можно так:
C#
1
2
3
4
string variableName = "testIntegrer";
Type variable_Type;
 
variable_Type = variableName.GetType();
1
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
29.08.2020, 18:02
randok, variableName.GetType() всегда будет возвращать тип String
1
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
29.08.2020, 18:12
TrickyBestia, в первом сообщении в коде так и написано, там даже сама переменная variable_Type является стрингом. Либо надо все нужные переменные объявлять как Type. Я так и не понял, что за задача стоит и зачем это все нужно.
0
Пора на C++?
 Аватар для TrickyBestia
370 / 264 / 99
Регистрация: 10.04.2020
Сообщений: 1,275
29.08.2020, 18:37
Цитата Сообщение от randok Посмотреть сообщение
Я так и не понял, что за задача стоит и зачем это все нужно.
Я тоже.
0
 Аватар для Yes Chad
3 / 3 / 1
Регистрация: 09.08.2020
Сообщений: 46
29.08.2020, 18:42  [ТС]
randok, Вот зачем:
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
    public string[] parametrs;
    public string path;
    public _value;
    public string variableType;
 
    [Header("переменные")]
    public int int1Test;
    public int int2Test;
    public bool bool1Test;
    public bool bool2Test;
 
public void GetFromFile()
    {
        path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + @"\Settings", "Settings.config");
        parametrs = new string[]
        {
            "bool1Test",
            "bool2Test",
            "int1Test",
            "int2Test"
        };
        Read(parametrs);
    }
public void Read(string[] parametrs)
    {
        for (int i = 0; i < parametrs.Length; i++)
        {
            string parametr = String.Join(null, parametrs[i]);
            using (StreamReader str = new StreamReader(path, Encoding.Unicode))
            {
                while (!str.EndOfStream)
                {
                    string line = str.ReadLine();
                    if (line.StartsWith(parametr))
                    {
                        _value = line.Replace($"{parametr}=", null);
                        variableType = GetType().GetField(parametr).ToString();
                        variableType = variableType.Substring(0, variableType.IndexOf(' '));
 
                        //найти переменную по строке parametr и присвоить найденной переменной значение _value
                        
                        break;
                    }
                }
                str.Close();
            }
        }
    }
Перед тем как завершится цикл (break ; ) мне надо найти переменную по строке parametr и присвоить найденной переменной значение _value
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.08.2020, 18:51
Почему просто не использовать что-то стандартное, например сериализацию или вообще функционал файлов настроек который доступен из коробки?

Зачем вы пытаетесь сделать это изобрести велосипед?
0
 Аватар для Yes Chad
3 / 3 / 1
Регистрация: 09.08.2020
Сообщений: 46
29.08.2020, 18:58  [ТС]
Someone007, Так надо.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.08.2020, 19:01
Цитата Сообщение от Yes Chad Посмотреть сообщение
Так надо.
Это не ответ.

Но раз надо, то делайте... Как уже выше подсказал...
0
619 / 399 / 187
Регистрация: 28.11.2019
Сообщений: 867
29.08.2020, 19:32
Yes Chad, это реальный код ? Просто возникает множество вопросов. Зачем объявлены переменные
C#
1
2
3
4
public int int1Test;
public int int2Test;
public bool bool1Test;
public bool bool2Test;
если массив parametrs строковый. Зачем массив склеивать в одну строку ? Зачем вот это
C#
1
variableType = GetType().GetField(parametr).ToString();
если и так известно, что это строка, так как переданный массив состоит из строк и склеивается в строку. Не проще прочитать Settings.config по разделителю в массив и сравнить что нужно ? Или файл Settings.config представляет из себя одну сплошную строку ?
1
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
29.08.2020, 19:52
Цитата Сообщение от Someone007 Посмотреть сообщение
GetType/GetMethod/Invoke
Собственно примерно так это работает...

Код не полный, потому что
Цитата Сообщение от Yes Chad Посмотреть сообщение
Так надо.
Миниатюры
Конвертировать String в struct (например, string "System.Int32" в struct System.Int32)  
1
172 / 91 / 36
Регистрация: 22.05.2020
Сообщений: 308
29.08.2020, 20:03
Лучший ответ Сообщение было отмечено Yes Chad как решение

Решение

Yes Chad,
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
using System;
 
namespace ConsoleApp3
{
    class A
    {
        public int testInteger = 123;
        public void M()
        {
            string variableName = "testInteger";
            var type = GetType();
            var fieldInfo = type.GetField(variableName);
            string value = "54";
            object objValue = Convert.ChangeType(value, fieldInfo.FieldType);
 
            //находим переменную по строке variableName и задаем ей значение
            GetType().GetField(variableName).SetValue(this, objValue);
        }
}
    class Program
    {
        static void Main(string[] args)
        {
            var a = new A();
            Console.WriteLine(a.testInteger);
            a.M();
            Console.WriteLine(a.testInteger);
        }
    }
}
1
 Аватар для Yes Chad
3 / 3 / 1
Регистрация: 09.08.2020
Сообщений: 46
29.08.2020, 20:16  [ТС]
valker, Спасибо, добрый человек. Дай бог тебе здоровья!

Добавлено через 2 минуты
Ребята, спасибо всем за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.08.2020, 20:16
Помогаю со студенческими работами здесь

Избавиться от вывода System.Int32[]
Пресловутое system.int32 в конце массива при выводе. Как избавиться? Возможно ошибки в коде, подскажите. ...

Тип данных System.Int32
Добрый день. Пытаюсь разобраться с типами данных (для примера выбрала System.Int32). На referencesousre показано как реализован...

Исключение [System.Linq.Enumerable+WhereSelectEnumerableIterat­or`2[System.Text.RegularExpressions.Match,System.String]
Здравствуйте ! Нужно объединить textlogin и Result в одну часть, Но появляется ошибка , не могу понять почему , можете...

Почему массив B выводится System.Int32[]
using System; namespace ConsoleApp5 { class Program { static void Main(string args) { ...

Выводится строка System.Int32[] Что делать?
Всем привет. Прошу помочь тех, кто уже встречался с такой проблемой и/или знает, что делать. Проблема в том, что VS не подсвечивает...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
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? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru