Используя тип get, а затем приведение к этому типу в C #

2

У меня есть код вроде:

var t = SomeInstanceOfSomeClass.GetType();
((t)SomeOtherObjectIWantToCast).someMethodInSomeClass(...);

Этого не произойдет, компилятор возвращает ошибку о (t) выражении типа или пространства имен, ожидаемых. Как вы можете это сделать?

Я уверен, что на самом деле это действительно очевидно....

  • 0
    Почему ты хочешь делать с этим? Даже если бы вы могли это сделать, вы не смогли бы вызывать методы или другие вещи на нем, поскольку C # - это язык статической типизации.
  • 0
    Dupe: stackoverflow.com/questions/972636 / ...
Теги:
reflection
casting

4 ответа

8
Лучший ответ

С# 4.0 позволяет это с помощью dynamic.

Тем не менее, вы почти наверняка не хотите этого делать, если не выполняете COM-взаимодействие или не записываете среду выполнения для динамического языка. (Джон у вас есть другие случаи использования?)

  • 2
    Да, несколько: двойная отправка сделала намного проще (при потере безопасности во время компиляции); использование операторов с дженериками; делать вызовы универсальных методов, где типы известны только во время выполнения, намного проще.
  • 0
    dynamic полезен и в некоторых других сценариях, главным образом, не только для написания среды выполнения для динамического языка, но и для взаимодействия с динамической средой (IronPython, IronRuby, Javascript и т. д.).
Показать ещё 4 комментария
3

Я ответил на дублированный вопрос здесь. Однако, если вам просто нужно вызвать метод для экземпляра произвольного объекта в С# 3.0 и ниже, вы можете использовать отражение:

obj.GetType().GetMethod("someMethodInSomeClass").Invoke(obj);
1
if(t is ThisType) {
    ThisType tt = (ThisType)t;
    /*do something here*/
}else if(t is ThatType) {
    ThatType tt = (ThatType)t;
    /*do something here*/
}

и др.

Это лучшее, что вы можете сделать на С# 3.5 и ниже, действительно.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню