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

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

3 голосов
/ 17 сентября 2009

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

как то так:

object obj;

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

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

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

Ответы [ 5 ]

6 голосов
/ 17 сентября 2009

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

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

4 голосов
/ 17 сентября 2009

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

public class IAcceptValueTypes<T> where T: struct

private T obj;

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

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

4 голосов
/ 17 сентября 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;

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

1 голос
/ 17 сентября 2009

В настоящее время у меня нет Visual Studio перед собой, чтобы попробовать, но почему бы вам не поискать:

  • GetType
  • Convert.ChangeType
1 голос
/ 17 сентября 2009

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

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