2010-10-14 4 views
1

Je passe un type dynamique dans une méthode et j'ai quelques problèmes pour exécuter le code. Vous vous demandez si vous pouvez passer un objet dynamique en tant que paramètre en utilisant le mot-clé out.Type dynamique dans le paramètre de méthode

Ci-dessous le code.

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); 

Le problème est lié à la méthode d'impression. où le dernier argument passe dans un objet dynamique.

Répondre

0

Cela dépend de la signature de type réelle de la méthode Print. Le type dynamic est représenté comme object à l'exécution, donc si la méthode Print prend un out paramètre de type object (ou dynamic), alors cela devrait fonctionner. Si la méthode Print possède un paramètre réel out d'un autre type, le type d'exécution réel utilisé sur le côté de l'appelant ne correspond pas au type réel de la déclaration, il ne fonctionnera donc pas.

+0

J'essaye d'arriver à la méthode d'impression mais je semble lutter actuellement avec ça. J'ai pu y entrer aujourd'hui à un moment donné et j'ai vu que les 3 premiers paramètres sont ce qui est attendu, la dernière méthode est de type Message message ... si je me souviens bien le type de Message était lié à une interface de message .. Je suis sûr que cela n'aide pas, mais je me souviens que la méthode n'a pas pris un paramètre ref ou d'un type dynamique .. Je vais encore essayer et entrer dans le sdk pour voir le code réel, mais je voulais répondre avant la fin de la soirée. Merci pour l'aide ... – gevjen

+0

aussi .. comme c'est un objet com j'ai pu créer une application WPF et utiliser le même code sans aucune erreur ou problème. J'en ai besoin pour courir dans une application Silverlight. Je ne peux pas référencer un objet COM dans l'application SL, donc je le fais de cette façon. Cette ligne de code qui me pose des problèmes (la méthode d'impression) a parfaitement fonctionné quand elle a fonctionné dans une application wpf. – gevjen

1

Lorsque vous transmettez un paramètre out à une méthode avec une variable de type dynamic, le paramètre lui-même doit être de type dynamic. Le code suivant est légal:

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

En fait, SomeMethod peut affecter n'importe quoi à la valeur. Lorsque le paramètre n'est pas de type dynamic alors le compilateur tente de convertir avant l'appel de la méthode, ce qui n'est pas autorisé, donc si le paramètre dans SomeMethod est tout sauf dynamique, vous n'avez pas de chance.

+0

Merci Steve. aller un peu plus loin avec mon problème. Je construis une application Silverlight. J'ai un objet com que j'essaie de référencer. Je ne peux pas référencer un objet com dans mon projet SL. donc pour tester le code sur lequel je travaillais. J'ai construit une application wpf et j'ai branché les choses pour que ça marche (impression). Une fois que je savais que le code fonctionnait, j'ai transféré ce code à mon application Silverlight en utilisant le mot-clé dynamique pour obtenir un contrôle sur l'objet com. Cette ligne d'impression dans mon code a travaillé dans mon application wpf, mais ne fonctionne pas quand je suis transféré à mon application SL .. pas sûr si cela aide, mais pensé que je le jetterais dedans ... merci pour l'aide – gevjen

+0

voici le code de la méthode d'impression. [DispId (48)] [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] BtPrintResult Imprimer ([MarshalAs (UnmanagedType.BStr), In] chaîne PrintJobName = "", [In] booléen WaitForSpoolJobToComplete = true, [In] int TimeoutMs = -1, [MarshalAs (UnmanagedType.Interface)] out Messages Messages = null); – gevjen

+0

Ce dernier paramètre est [MarshalAs (UnmanagedType.Interface)] sur Messages Messages = null) ... donc il a le mot-clé out ... mais c'est de type Message ... – gevjen

Questions connexes