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

У меня есть такой код:

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

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

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


person Matt    schedule 11.08.2009    source источник
comment
Зачем тебе это нужно? Даже если бы вы могли это сделать, вы не смогли бы вызывать на нем методы или другие вещи, поскольку C # - это статически типизированный язык.   -  person mmx    schedule 11.08.2009
comment
Dupe: stackoverflow.com/questions / 972636 /   -  person mmx    schedule 12.08.2009


Ответы (4)


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

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

person Sam Harwell    schedule 11.08.2009
comment
Ага, несколько: двойная отправка стала намного проще (с потерей безопасности во время компиляции); использование операторов с дженериками; намного проще выполнять вызовы общих методов, типы которых известны только во время выполнения. - person Jon Skeet; 12.08.2009
comment
dynamic также полезен в некоторых других сценариях, в основном, не только для написания среды выполнения для динамического языка, но и для взаимодействия с динамической средой (IronPython, IronRuby, Javascript и т. Д.). - person mmx; 12.08.2009
comment
@Jon - как ты узнал, что тебя вызывают ?! - person Russ Cam; 12.08.2009
comment
Спасибо за вклад. :) Я больше работаю с аспектами реализации, чем с вариантами использования этого типа конструкции. - person Sam Harwell; 12.08.2009
comment
Я использовал динамическую привязку при работе с контроллерами MVC API при использовании привязки модели. Например, если вы всегда хотите сопоставить токен API в ActionFilter, гораздо проще динамически привязать модель и проверить необходимый параметр, чем тестировать 20 или 30 отдельных типов объектов. - person dalemac; 13.10.2014

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

obj.GetType().GetMethod("someMethodInSomeClass").Invoke(obj);
person mmx    schedule 11.08.2009

if(t is ThisType) {
    ThisType tt = (ThisType)t;
    /*do something here*/
}else if(t is ThatType) {
    ThatType tt = (ThatType)t;
    /*do something here*/
}

и Т. Д.

На самом деле, это лучшее, что вы можете сделать в C # 3.5 и ниже.

person Ben Lesh    schedule 11.08.2009

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

person Joseph    schedule 11.08.2009