2011-05-27 4 views
13

Existe-t-il un moyen d'accéder à des objets DLR (par exemple, instance de sous-classe DynamicObject) (propriétés et méthodes) dans F # qui est similaire à C# dynamic?Accès objet dynamique F #

Répondre

9

Il y a un module maintenant NuGet qui utilise le dlr pour mettre en œuvre l'opérateur dynamique. Il a plusieurs avantages par rapport à un grand nombre de snippets disponibles sur le marché.

  • Performance utilise Dynamitey pour l'appel dlr qui met en œuvre la mise en cache et est une bibliothèque PCL
  • méthodes poignées qui reviennent vides, vous aurez une exception si la liaison ne vous défaussez pas de ceux-ci.
  • Le dlr gère le cas d'appel d'un retour délégué par une fonction automatiquement, cela vous permettra également de faire la même chose avec un FSharpFunc
  • Ajoute un!? préfixe opérateur pour gérer l'appel direct des objets dynamiques et des fonctions dont vous n'avez pas le type au moment de l'exécution.

    Il est open source, licence Apache, vous pouvez regarder le implementation et le test unitaire de base example cases.

5

Oui, c'est. Vous pouvez utiliser l'opérateur ? dans F #, et il fonctionnera de la même manière en typage dynamique en C# et VB.NET en .NET 4.0. Pour commencer, vous pouvez lire cet échantillon dynamique SQLDataReader du blog de Tomas Petricek:

http://tomasp.net/blog/dynamic-sql.aspx

Voici une citation de son article:

Dans cet article, nous allons voir comment utiliser l'opérateur dynamique pour rendre l'expérience d'utiliser ADO.NET de F # nettement mieux. Opérateur dynamique (il y en a en fait deux) un moyen simple de prendre en charge dynamique invoquer en F #. Nous pouvons l'utiliser pour écrire code qui ressemble presque à un appel de méthode ordinaire ou la propriété accès, mais est résolue dynamiquement au runtime (en utilisant le nom de la méthode ou propriété). L'exemple suivant montre ce que nous serons en mesure d'écrire à la fin de cet article:

// Call 'GetProducts' procedure with 'CategoryID' set to 1 
use conn = new DynamicSqlConnection(connectionString) 
use cmd = conn?GetProducts 
cmd?CategoryID <- 1 
conn.Open() 

// Read all products and print their names 
use reader = cmd.ExecuteReader() 
while reader.Read() do 
    printfn "Product: %s" reader?ProductName 

Si vous avez déjà essayé d'appeler une procédure stockée SQL directement en utilisant le SqlCommand, vous pouvez certainement apprécier l'élégance de ce code extrait. Jetons maintenant un coup d'oeil un exemple plus grand et quelques-uns des trucs soignées qui rendent cela possible ...

Et pour plus d'informations, vous pouvez lire le reste de son article. Heureux codage dynamique en F # :)

+0

tnx. étrange comment Google n'est pas venu avec ce lien sur F # dlr/dynamique de distribution: \ mon google-fu suce –

+0

Vous êtes les bienvenus. vous avez raison, il n'apparaît pas dans la requête google. –

+1

En fait? dans F # n'est pas la même chose que dynamique dans C# et l'exemple de procédure stockée de Tomas n'utilise pas le DLR. Voir la réponse de Tomas et l'autre question liée. –

8

Comme eriawan mentionné, l'opérateur ? se comporte un peu comme le type dynamic en C#. L'article sur l'appel de SQL ne repose sur rien du DLR, car vous pouvez fournir votre propre implémentation de l'opérateur ? et le compilateur l'utilise directement.

J'ai également écrit un bref exemple de la façon d'utiliser l'opérateur ? pour appeler des membres en utilisant DLR, qui est available on F# snippets et il y en a un plus sophisticated version by Matthew Podwysocki. Un autre extrait montre comment l'utiliser pour appeler la norme .NET types using Reflection.

Voir aussi: