C# 方法参数中的动态类型
我将一个动态类型传递到一个方法中,在运行代码时遇到了一些问题。想知道是否能够使用out关键字将动态对象作为参数传递给 下面是代码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
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。