Мне нужен способ привести объект к типу, который не известен во время компиляции.
что-то вроде этого:
object obj;
public (type of obj) Obj
{
get
{
return obj
}
set
{
obj = (type of obj)value;
}
}
Единственное, что известно, это то, что obj является типом значения.
Сомневаюсь, что такое возможно. Просто проверяю, есть ли у кого-нибудь умный способ сделать это.
Ответ 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;
Фактическое определение типа теперь находится за пределами вашего класса как параметр универсального типа. Строго говоря, тип по-прежнему статичен в том смысле, что он известен во время компиляции.