У меня есть код вроде:
var t = SomeInstanceOfSomeClass.GetType();
((t)SomeOtherObjectIWantToCast).someMethodInSomeClass(...);
Этого не произойдет, компилятор возвращает ошибку о (t) выражении типа или пространства имен, ожидаемых. Как вы можете это сделать?
Я уверен, что на самом деле это действительно очевидно....
С# 4.0 позволяет это с помощью dynamic
.
Тем не менее, вы почти наверняка не хотите этого делать, если не выполняете COM-взаимодействие или не записываете среду выполнения для динамического языка. (Джон у вас есть другие случаи использования?)
dynamic
полезен и в некоторых других сценариях, главным образом, не только для написания среды выполнения для динамического языка, но и для взаимодействия с динамической средой (IronPython, IronRuby, Javascript и т. д.).
Я ответил на дублированный вопрос здесь. Однако, если вам просто нужно вызвать метод для экземпляра произвольного объекта в С# 3.0 и ниже, вы можете использовать отражение:
obj.GetType().GetMethod("someMethodInSomeClass").Invoke(obj);
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 и ниже, действительно.
Чтобы написать способ, который вы описываете в своем вопросе, вы должны объявить тип во время компиляции, а не время выполнения. Вот почему вы столкнулись с проблемами.