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

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

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

object obj;

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

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

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


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


Ответы (5)


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

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

person Mark Seemann    schedule 17.09.2009
comment
Сражаясь с такими сценариями в нескольких проектах, я бы сказал, что общий интерфейс может быть лучшим выходом. Доступ к его функциональности в зависимости от типа будет немного больше связан с наличием переключателя или какого-либо типа селектора на каком-то этапе (так почему бы не иметь приведение типа с самого начала?), В конце концов, если неизвестно, как вы узнаете, что делать доступ один раз закидал? Если это часть какого-то типа плагина exec, использование отражения и доступ к его методам и свойствам через это устранит необходимость приведения, следовательно, слабо связано. Угадай, все это зависит от того, для чего тебе это нужно - person samiq; 17.09.2009

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

public class IAcceptValueTypes<T> where T: struct

private T obj;

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

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

person Jon Limjap    schedule 17.09.2009

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

Варианты:

  • Отражение
  • 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;

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

person Thorarin    schedule 17.09.2009

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

  • GetType
  • Convert.ChangeType
person Hai Vu    schedule 17.09.2009

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

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