2014-12-30 2 views
-1

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

Так что я хотел бы знать, есть ли способ найти базовый тип динамической переменной во время выполнения.

Динамическая переменная - это значение, возвращаемое из функции COM, поэтому UnWrap не работает, а GetType() возвращает тип COMObject.

благодаря

+1

Зачем вам нужно его бросать? Просто сделайте параметр своего метода тем типом, в который вы его обычно набрасывали, и передайте его. Время выполнения будет заботиться обо всем остальном. –

+0

Хороший способ помочь вам открыть тип объекта - использовать ваш отладчик. Поместите точку останова на строку после вызова метода и используйте окно «Часы» для проверки возвращаемого объекта. –

+1

Положив это другим способом, притворись, что ссылка «dynamic» у вас уже есть того типа, в котором вы нуждаетесь, и напишите свой код соответствующим образом. Было бы легче продемонстрировать, что я имею в виду, если вы показали нам какой-то код. –

ответ

0

Если объект возвращается может быть один из многих типов, то вы лучше, чтобы продолжать использовать его в качестве dynamic и только пытаюсь доступ к методам и свойствам вы знаете будут существовать (я бы ожидайте, что у COM-метода будет некоторое указание на то, как использовать динамический результат).

var canBeLiterallyAnything = ComMethod(); 
canbeLiterallyAnything.MethodDocsSayExists(); 
var propVal = canBeLiterallyAnything.SomeProperty; 

Конечно, если все возможные типы реализуют один и тот же интерфейс, вы можете использовать этот интерфейс.

var typeSafeReference = (ISharedInterface)canBeLiterallyAnything; 

Если вы знаете, что метод COM возвращает конкретный тип, но просто не знаете, что тип является то для целей исследования можно назвать GetType() и либо записать его на консоль или установить контрольную точку и осмотрите его. Это позволит вам затем обновить свой код, включив в него этот тип (который минимизирует влияние использования dynamic, но также может ввести риск плохого приведения, если могут быть возвращены другие типы).

var type = canBeLiterallyAnything.GetType(); 

// e.g. If the above returns a Type of 'SpecificType', then you can update code to 
var typeSafeReference = (SpecificType)canBeLiterallyAnything; 

Следует отметить, что метод COM не может вернуть конкретный типа, это может быть возвращение анонимного объекта, в этом случае нет никакого литья вы можете сделать, так что вы должны будете продолжать использовать его как dynamic и только доступ к свойствам/методам, которые, как вы знаете, существуют.

+0

При доступе через часы или получении типа тип переменной является COMObject. Поэтому у меня нет подсказки относительно того, к какому типу нужно передать переменную. Также я не могу проверить реализацию метода COM, поэтому не могу найти тип возвращаемого объекта. –

Смежные вопросы