C# 方法参数中的动态类型

C# 方法参数中的动态类型,c#,silverlight,types,C#,Silverlight,Types,我将一个动态类型传递到一个方法中,在运行代码时遇到了一些问题。想知道是否能够使用out关键字将动态对象作为参数传递给 下面是代码 dynamic btApp = AutomationFactory.CreateObject("Test.Application"); dynamic btMessages; dynamic btFormat = btApp.Formats.Open("c:\\Temp/Format1.btw", false, ""); btFormat.SetNamedSubSt

我将一个动态类型传递到一个方法中,在运行代码时遇到了一些问题。想知道是否能够使用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);

问题在于打印方法。最后一个参数传入动态对象的位置。

它取决于
Print
方法的实际类型签名是什么。
dynamic
类型在运行时表示为
object
,因此如果
Print
方法将
类型
object
(或
dynamic
)的
参数取出来,那么它应该可以工作


如果
Print
方法具有其他类型的实际
out
参数,则调用方一侧使用的实际运行时类型与声明的实际类型不匹配,因此它将不起作用。

这取决于
Print
方法的实际类型签名是什么。
dynamic
类型在运行时表示为
object
,因此如果
Print
方法将
类型
object
(或
dynamic
)的
参数取出来,那么它应该可以工作


如果
Print
方法具有其他类型的实际
out
参数,则调用方一侧使用的实际运行时类型与声明的实际类型不匹配,因此,它将不起作用。

当您将参数传递给具有动态类型变量的方法时,参数本身必须是动态类型。以下代码是合法的:

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

事实上,SomeMethod可以为值分配任何内容。当参数不是动态类型时,编译器会尝试在方法调用之前进行转换,这是不允许的,因此,如果SomeMethod中的参数不是动态的,那么您的运气就不好了。

当您将out参数传递给具有动态类型变量的方法时,参数本身必须是动态类型。以下代码是合法的:

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

事实上,SomeMethod可以为值分配任何内容。如果参数不是dynamic类型,那么编译器会尝试在方法调用之前进行转换,这是不允许的,因此如果SomeMethod中的参数不是dynamic类型,那么您的运气就不好了。

我正在尝试使用print方法,但我现在似乎正在努力解决这个问题。我今天在某个时候进入了那里,我看到前3个参数是预期的,最后一个方法是Message Message类型…如果我没记错的话,消息类型与消息接口绑定..我确信这没有帮助,但我记得该方法没有使用ref参数或动态类型..我仍然会尝试进入sdk查看实际代码,但希望在晚上结束前做出响应..感谢您的帮助..同时..由于这是一个com对象,所以我能够构建WPF应用程序并使用相同的代码,没有任何错误或问题。我需要它在silverlight应用程序中运行。我无法在SL应用程序中引用COM对象,因此我是这样做的。这行给我带来麻烦的代码(print方法)在wpf应用程序中运行时运行得非常好。我正在尝试使用print方法,但我现在似乎正在努力解决这个问题。我今天在某个时候进入了那里,我看到前3个参数是预期的,最后一个方法是Message Message类型…如果我没记错的话,消息类型与消息接口绑定..我确信这没有帮助,但我记得该方法没有使用ref参数或动态类型..我仍然会尝试进入sdk查看实际代码,但希望在晚上结束前做出响应..感谢您的帮助..同时..由于这是一个com对象,所以我能够构建WPF应用程序并使用相同的代码,没有任何错误或问题。我需要它在silverlight应用程序中运行。我无法在SL应用程序中引用COM对象,因此我是这样做的。这行给我带来麻烦的代码(打印方法)在wpf应用程序中运行时运行得非常好。谢谢Steve。我想进一步讨论我的问题。我正在构建一个silverlight应用程序。我试图引用一个com对象。我无法在SL项目中引用com对象。为了测试我正在编写的代码。我构建了一个wpf应用程序,并将其连接起来,使其能够工作(打印)。一旦我知道代码有效,我就使用dynamic关键字将代码传输到我的silverlight应用程序,以获得com对象的句柄。我的代码中的打印行在我的wpf应用程序中起作用,但在我转移到SL应用程序时不起作用。不确定这是否有帮助,但我认为我会将其加入…感谢帮助这里是来自打印方法的代码。[DispId(48)][MethodImpl(MethodImplOptions.InternalCall,MethodCodeType=MethodCodeType.Runtime)]BtPrintResult打印([Marshallas(UnmanagedType.BStr),In]string PrintJobName=“”,[In]bool WaitForSpoolJobToComplete=true,[In]int TimeoutMs=-1,[Marshallas(UnmanagedType.Interface)]out Messages Messages=null);最后一个参数是[MarshalAs(UnmanagedType.Interface)]out Messages=null)…所以它有out关键字..但是它是Message类型的..谢谢Steve。我想进一步讨论我的问题。我正在构建一个silverlight应用程序。我试图引用一个com对象。我无法在SL项目中引用com对象。为了测试我正在编写的代码。我构建了一个wpf应用程序,并将其连接起来,使其能够工作(打印)。一旦我知道代码有效,我就使用dynamic关键字将代码传输到我的silverlight应用程序,以获得com对象的句柄。我的代码中的打印行在我的wpf应用程序中起作用,但在我转到SL应用程序时不起作用。不确定这是否有帮助,但我认为我会将其加入…感谢帮助这里是来自打印方法的代码。[DispId(48)][MethodImpl(MethodImplOptions.InternalCall,MethodCodeType=MethodCodeType。