Задать вопрос
@firstmixon

Есть ли способ преобразовать объект к типу?

Пытаюсь выполнить следующий код, задача:
1) объявить переменную и задать ей значение;
2) сохранить Тип переменной в отдельной переменной;
3) связать переменную со значением с указателем и передать(куда нибудь);
4) по указателю и сохраненному типу вытащить значение.

в коде на последней строке вылезает ошибка, есть ли способ решить эту задачу?
кроме как явно задавать тип
var j = (int)x;

// Объявляем переменную
int i = 999;

// Определяем тип переменой
Type t = i.GetType();

// Связываем переменную с указателем
object x = i;

// Пытаемся вытащить с преобразованием значение
var j = (t)x; //тут ошибка "The type or namespace name 't' could not be found (are you missing a using directive or an assembly reference?)"
  • Вопрос задан
  • 33 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 2
VoidVolker
@VoidVolker Куратор тега C#
Dark side eye. А у нас печеньки! А у вас?
Во-первых, в C# нет такой операции, как "связывание переменной с указателем".
object x = i; // Это называется "боксинг" или же "упаковка". _ЗНАЧЕНИЕ_ переменной i копируется в кучу и возвращается ссылка на это значение (object)

То что ты хочешь сделать, сделать невозможно, тк тип переменной всегда должен быть известен на этапе компиляции, чтобы можно было выделить место на стеке.

Но! Можно приблизиться к этому через женерики и рефлексию. Дорого, неудобно, и не ясно, зачем нужно.
Если ты подскажешь, что ты планируешь дальше делать с j - тогда будет более полезный код.

using System;

static class App {
    public static void Main() {
        var i = 999;
        var t = i.GetType();
        var x = (object) i;

        var doSomethingMethod = typeof(Helper).GetMethod(nameof(Helper.DoSomething));
        var doSomethingIntMethod = doSomethingMethod!.MakeGenericMethod(typeof(int));

        doSomethingIntMethod.Invoke(null, new[]{x});
    }
}
public static class Helper {
        public static void DoSomething<T>(object x) {
            var j = (T) x;
            // далее работаем
            Console.WriteLine($"{typeof(T)} {j}"); // System.Int32 999           
        }
}

Если это как-то связано с предыдущим вопросом, то советую остановиться и очень хорошо подумать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы