82 votes

VB.Net l'équivalent en C# "dynamique" avec l'Option Strict Sur

Est-il un équivalent pour le C# 4 "dynamique" mot-clé lors de l'utilisation de 'type de coffre-fort VB.Net', c'est à dire avec Option Strict Sur?

62voto

Darin Dimitrov Points 528142

L'équivalent est l'Objet dans VB.NET mais avec Option Strict Off. Avec Option Strict On il n'y a pas d'équivalent. Mettre une autre manière, la dynamique de mots clés amène Option Strict Off des fonctionnalités équivalentes à C#.

39voto

Hans Passant Points 475940

Hmya, VB.NET toujours eu la "dynamique" intégrée. Cette syntaxe a été pris en charge pour toujours:

 Dim obj = new SomeComClass()
 obj.DoSomething()

La dynamique du mot clé de C#attraper jusqu'à ce que VB.NET peut faire pour un long temps. Néanmoins, VB.NET la version 10 ne le gain de quelques fonctionnalités supplémentaires, c'est à l'aide de la DLR. Qui permet l'interopérabilité avec les IronPython et IronRuby. C# copié de nombreuses autres VB.NET les fonctionnalités. Comme les paramètres facultatifs et de soutien pour les propriétés prendre des arguments.

La syntaxe est exactement la même chose, utilisez le mot clé Dim sans Que. Vous devez utiliser l'Option Strict Off, Option Infer on peut ramollir qui soufflent un peu. Il ne montrons que C# ajout de la dynamique de mots clés fut un très bon coup.

8voto

BobRodes Points 592

J'ai une ride que je viens de trouver sur ce sujet, qui pourrait être trouvé d'intéressant. J'ai ce bout de code en C# qui utilise la réflexion pour invoquer dynamiquement une méthode au moment de l'exécution:

var listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);

La raison pour laquelle je fais cela, c'est que "GetSomeData" pourrait être n'importe lequel d'un certain nombre de méthodes pour obtenir de différentes données. La méthode à invoquer ici dépend d'un paramètre de chaîne passée dans cet objet au moment de l'exécution, donc, la valeur de "GetSomeData" varie en fonction au moment de l'exécution.

La signature de "GetSomeData" est:

public List<SomeResultSetClass> GetSomeData()

Chacune de ces méthodes invoquée renvoie une sorte de List<T> objet. Ensuite, je suis l'envoi de la listResult objet à une méthode générique appelé à l'Exportation, qui ressemble à ceci:

void Export<T>(List<T> exportList, string filePath, byte fileType) where T: class;

Voici où nous nous heurtons à un problème. Invoquer retourne un objet de type System.Objet. Bien sûr, List<T> est aussi un Système.Objet, mais l'interface exposée est le Système.Interface d'un objet, pas l'interface IList. Si j'essaie d'exécuter la méthode d'Exportation, ainsi:

myExportObj.Export(listResult, parms.filePath, parms.fileType);

le code ne peut pas compiler. L'erreur est:

The type arguments for method '...Export<T>...' cannot be inferred from the usage. Try specifying the type arguments explicitly.

Non merci!! Le problème est que le compilateur ne peut pas trouver le IList métadonnées, parce que c'est en regardant le Système.Interface d'un objet. Maintenant, vous pouvez créer un nouveau List<T>, céder (List<Whatever>) listResult , mais qui défait le but de la dynamique de l'invocation à la première place.

La solution est de changer de var de dynamic:

dynamic listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, null);

Depuis dynamique contourne statique type de vérification au moment de la compilation, nous n'avons pas une erreur de compilation. Puis, lorsque l'objet dynamique est adoptée pour la méthode d'Exportation, le DLR (Dynamic Language Runtime) recherche pour voir si elle peut implicitement convertir l'objet de répondre aux exigences de la signature de la méthode. Ce qui bien sûr il peut.

Ok, donc, c'est comment les choses fonctionnent en C#. Avec VB, la ligne qui va comme ceci:

Dim listResult = tgtObj.GetType().GetMethod("GetSomeData").Invoke(tgtObj, Nothing)

Avec l'Option Strict on, cette ligne bouleverse le compilateur, comme prévu. Avec le tout, il fonctionne très bien.

3voto

Joel Coehoorn Points 190579

Vous pouvez activer l'Option Infer Sur et Option Strict Off, et toujours avoir quelque chose de très proche.

1voto

Vozzie Points 11

Il y a assez de moyens pour gérer les méthodes et les propriétés avec la fin de la liaison des objets COM et type de coffre-fort(en option strict). Cette lorsque vous utilisez le Microsoft.VisualBasic.L'Interaction.CallByName et du Système.Type.InvokeMember méthodes. (Ou en créer un autre "partielle" fichier où l'option strict est éteint).

Mais pour gérer les événements avec la fin de la liaison de VB.Net n'est pas aussi simple qu'avec le type dynamique en C#. Vous pouvez le vérifier sur ce "hack" pour que ici http://www.codeproject.com/Articles/563298/Dynamic-Events-in-VB-Net

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X