Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Динамическое литье?

Автор вопроса: remdaoОтветов: 5

Мне нужен способ привести объект к типу, который не известен во время компиляции.

что-то вроде этого:

object obj;

public (type of obj) Obj
{
    get
    {
        return obj
    }
    set
    {
        obj = (type of obj)value;
    }
}

Единственное, что известно, это то, что obj является типом значения.

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

  • Дженерики? Определите метод, подобный Indexer, в терминах T Gishu 17.09.2009
  • Я отредактировал код, чтобы было понятнее, что я пытаюсь сделать. remdao 17.09.2009
  • В вашем примере ваше приведение находится в сеттере, тогда как оно имеет больше смысла в геттере. Thorarin 17.09.2009

castingdynamic

Ответы

Ответ 1 · рейтинг 6 · Mark Seemann

Это невозможно в C # 3.0, но если бы вы могли определить общий интерфейс, который реализуют все ваши объекты, вы могли бы привести к нему.

В C # 4.0 мы получим ключевое слово dynamic, которое позволяет нам выполнять Duck Typing.

Ответ 2 · рейтинг 4 · Jon Limjap

Что ж, вы можете сделать это с помощью дженериков:

public class IAcceptValueTypes<T> where T: struct

private T obj;

public T Obj
{
    get { return obj; }
    set { obj = value; }
}

Общее ограничение where T: struct ограничивает допустимый тип типами значений.

Ответ 3 · рейтинг 4 · Thorarin

Такое приведение на самом деле ничего не сделает, потому что вы присваиваете переменную обратно с более свободным вводом. Ваш лучший подход зависит от того, что вы хотите делать с типом значения после его "преобразования".

Варианты:

  • Отражение
  • C # 4.0 dynamic набор текста.
  • Простой switch или if .. else в зависимости от типа переменной.

Изменить: использование универсального класса на самом деле не решает вашу проблему, если вы ничего не знаете о типе во время компиляции, но ваш пример не иллюстрирует фактическое использование вашего класса, поэтому возможно, что я ' м, неверно истолковав ваши намерения. Возможно, вы ищете что-то вроде этого:

class MyClass<T> where T: struct
{
    T obj;

    public T Obj
    {
        get { return obj; }
        set { obj = value; }
    }
}

MyClass<int> test = new MyClass<int>();
test.Obj = 1;

Фактическое определение типа теперь находится за пределами вашего класса как параметр универсального типа. Строго говоря, тип по-прежнему статичен в том смысле, что он известен во время компиляции.

Ответ 4 · рейтинг 1 · Hai Vu

У меня сейчас нет Visual Studio, чтобы попробовать, но почему бы вам не посмотреть:

  • GetType
  • Convert.ChangeType

Ответ 5 · рейтинг 1 · Grigory Bushuev

зачем тебе такой кастинг?

  1. Если количество типов ограничено, вы можете реализовать универсальную версию своей собственности.
  2. Вы можете использовать отражение, чтобы понять тип переданного объекта и привести его к этому типу.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы