2010-10-14 139 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

我试图去打印方法,但我似乎现在是正确的挣扎。我能够在某个时间进入,并且我看到前三个参数是预期的,最后一个方法是消息消息类型...如果我没有记错,消息类型被绑定到消息接口..我确定这没有帮助,但我记得该方法没有采取ref参数或动态类型..我仍然会尝试进入sdk看到实际的代码,但想在晚上结束前作出回应..感谢您的帮助... – gevjen 2010-10-14 02:20:19

+0

也..因为这是一个COM对象,我能够建立一个WPF应用程序,并使用相同的代码没有任何错误或问题。我需要它运行在Silverlight应用程序中。我无法在SL应用程序中引用COM对象,所以我这样做。这行代码给我带来麻烦(打印方法)在wpf应用程序中运行时工作得很好。 – gevjen 2010-10-14 02:22:03

1

当你传递一个输出参数的方法与一个变量,它是类型的动态参数本身的类型必须是动态的。以下代码是合法的:

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对象,我试图引用。我无法在SL项目中引用com对象。所以要测试我正在处理的代码。我建立了一个wpf应用程序并连接了一些东西,这样它就可以工作(打印)。一旦我知道代码工作了,我就可以使用dynamic关键字将该代码转移到我的silverlight应用程序中,以获得com对象的句柄。在我的代码打印线在我的WPF应用程序的工作,但不会当我转移到我的SL app..not确定是否有帮助,但以为我会扔在感谢帮助 – gevjen 2010-10-14 02:27:25

+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 2010-10-14 02:35:08

+0

最后一个参数是[MarshalAs(UnmanagedType.Interface)] Out Messages Messages = null)...所以它有out关键字..但是它的类型Message ... – gevjen 2010-10-14 02:36:26