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

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

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

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)


arrow_upward
6
arrow_downward

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

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

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

arrow_upward
4
arrow_downward

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

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

arrow_upward
4
arrow_downward

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

Варианты:

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

arrow_upward
1
arrow_downward

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

  • GetType
  • Convert.ChangeType
person Hai Vu    schedule 17.09.2009

arrow_upward
1
arrow_downward

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

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