2010-10-14 4 views
1

Я передаю динамический тип в метод и имею некоторые проблемы с запуском кода. Удивление, если вы можете передать динамический объект в качестве параметра, используя ключевое слово out.Динамический тип в параметре метода

Ниже приведен код.

dynamic btApp = AutomationFactory.CreateObject("Test.Application"); 
dynamic btMessages; 

dynamic btFormat = btApp.Formats.Open("c:\\Temp/Format1.btw", false, ""); 
btFormat.SetNamedSubStringValue("testing", "testtest"); 
btFormat.Print("Job1", true, -1, out btMessages); 
btFormat.Close(2); 

выпуск есть в печати способ. где последний аргумент передается в динамическом объекте.

ответ

0

Это зависит от того, какова фактическая подпись типа метода Print. Тип dynamic представлен как object во время выполнения, поэтому, если метод Print принимает параметр out типа object (или dynamic), тогда он должен работать.

Если метод Print имеет действительный параметр out другого типа, тогда фактический тип времени выполнения, используемый сбоку вызывающего, не соответствует фактическому типу декларации, поэтому он не будет работать.

+0

Я пытаюсь добраться до метода печати, но, похоже, сейчас я боюсь этого. В какой-то момент мне удалось попасть туда, и я увидел, что первые 3 параметра - это то, что ожидается, последний метод имеет тип Message message ... если я правильно помню, тип сообщения был привязан к интерфейсу сообщений. Я уверен, что это не помогает, но я помню, что метод did not принимал параметр ref или динамического типа. Я все равно попытаюсь войти в sdk, чтобы увидеть фактический код, но хотел бы ответить до конца вечера. Спасибо за помощь ... – gevjen

+0

также .. Поскольку это com-объект, я смог создать приложение WPF и использовать тот же код без каких-либо ошибок или проблем. Мне нужно, чтобы он запускался в приложении silverlight. Я не могу ссылаться на COM-объект в приложении SL, поэтому я делаю это так. Эта строка кода, которая вызывает у меня проблемы (метод печати), отлично справилась, когда она запускалась внутри приложения wpf. – gevjen

1

Когда вы передаете параметр out в метод с переменной типа dynamic, сам параметр должен иметь тип dynamic. Следующий закон является законным:

class Program { 
    static void Main(string[] args) { 
     dynamic value; 
     SomeMethod(out value); 
     return; 
    } 
    static void SomeMethod(out dynamic value) { 
     value = "5"; 
     return; 
    } 
} 

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

+0

Спасибо Стив. чтобы пойти немного дальше с моей проблемой. Я создаю приложение silverlight. У меня есть объект com, который я пытаюсь использовать. Я не могу ссылаться на объект com в моем проекте SL. поэтому для проверки кода, над которым я работал. Я создал приложение wpf и подключил его, чтобы он работал (печатал). Как только я узнал, что этот код работал, я передал этот код в приложение silverlight, используя ключевое слово dynamic, чтобы получить дескриптор объекта com. Эта строка печати в моем коде работала в моем приложении wpf, но не работает, когда я перешел на мое приложение SL ... не уверен, что если это поможет, но я подумаю, что я его выброшу ... спасибо за помощь – gevjen

+0

вот код от метод печати. ​​[DispId (48)] [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] BtPrintResult Print ([MarshalAs (UnmanagedType.BStr), In] string PrintJobName = "", [In] bool WaitForSpoolJobToComplete = true, [In] int TimeoutMs = -1, [MarshalAs (UnmanagedType.Interface)] out Messages Messages = null); – gevjen

+0

Этот последний параметр [MarshalAs (UnmanagedType.Interface)] out Messages Messages = null) ... поэтому у него есть ключевое слово out, но его тип Message ... – gevjen

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