Comment puis-je évaluer le code C# de façon dynamique?
Je peux faire un eval("something()");
pour exécuter le code dynamiquement en JavaScript. Est-il un moyen pour moi de faire la même chose en C#?
Un exemple de ce que je suis en train de faire: j'ai une variable de type entier (dire i
) et j'ai plusieurs propriétés par les noms de: "Propriété1", "Propriété2", "Propriété3", etc.
Maintenant, je veux effectuer certaines opérations sur la "Propriétéje" de la propriété en fonction de la valeur de i
.
C'est vraiment simple avec Javascript. Est-il possible de faire cela avec C#?
- Jetez un oeil à Mono est CSharp shell interactif. Il a eval-comme des fonctions.
- c# appel ironpython de eval. Je l'ai essayé en c# 4.0. pas d'expérience avec c# 2.0
- De Long, où puis-je trouver de la documentation sur IronPython est eval ?
- Je sais que ce Q&A est assez daté, mais je viens de sortir un liste de lecture vidéo qui sonne beaucoup comme la description donnée dans Davide Icardi réponse. C'est radicalement différent, et probablement la peine de vérifier.
Vous devez vous connecter pour publier un commentaire.
Malheureusement, C# n'est pas un langage dynamique comme ça.
Ce que vous pouvez faire, cependant, est de créer un code source en C# fichier, plein de classe et tout et tout, et le lancer à travers la CodeDom fournisseur pour C# et les compiler dans une assemblée, et puis l'exécuter.
Ce post sur le forum sur MSDN contient une réponse avec un exemple de code en bas de la page un peu:
créer une méthode anonyme à partir d'une chaîne?
J'aurais peine à dire que c'est une très bonne solution, mais il est possible de toute façon.
Quel type de code que vous allez attendre dans cette chaîne? Si c'est un mineur sous-ensemble de code valide, par exemple juste des expressions mathématiques, il se pourrait que d'autres alternatives existent.
Modifier: eh Bien, qui m'apprend à lire les questions à fond en premier. Oui, la réflexion serait en mesure de vous donner un peu d'aide ici.
Si vous divisez la corde par la, d'abord, pour obtenir des propriétés individuelles, vous pouvez utiliser le code suivant pour obtenir un PropertyInfo objet d'une propriété particulière d'une classe, puis d'utiliser cet objet pour manipuler un objet particulier.
Lien: PropertyInfo.Méthode SetValue
À l'aide de la Roslyn API de script (plus les échantillons ici):
Vous pouvez également exécuter un morceau de code:
De référence et le code qui a été généré dans les courses précédentes:
Pas vraiment. Vous pouvez utiliser la réflexion pour atteindre ce que vous voulez, mais il ne sera pas aussi simple que dans le Javascript. Par exemple, si vous souhaitez définir le domaine privé d'un objet à quelque chose, vous pouvez utiliser cette fonction:
C'est une fonction eval sous c#. Je l'ai utilisé pour convertir des fonctions anonymes (les Expressions Lambda) à partir d'une chaîne.
Source: http://www.codeproject.com/KB/cs/evalcscode.aspx
J'ai écrit un projet open source, Dynamique Expresso, qui peut convertir le texte de l'expression écrite à l'aide d'une syntaxe C# dans délégués (ou de l'expression de l'arbre). Les Expressions sont analysées et transformées en Des Arbres D'Expression sans l'aide de la compilation ou de réflexion.
Vous pouvez écrire quelque chose comme:
ou
Mon travail est basé sur Scott Gu article http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx .
Tout cela serait certainement le travail. Personnellement, pour ce problème, je serais probablement prendre un peu différente de l'approche. Peut-être quelque chose comme ceci:
Lors de l'utilisation de modèles de ce genre, vous devez être attentif à ce que vos données sont stockées par référence et non par valeur. En d'autres termes, ne pas le faire avec les primitives. Vous devez utiliser leur gros ballonnement classe homologues.
J'ai réalisé que ce n'est pas exactement la question, mais la question a été assez bien répondu et j'ai pensé que peut-être une autre approche pourrait aider.
Je ne sais pas maintenant si vous voulez absolument exécuter C# déclarations, mais vous pouvez déjà exécuter le code Javascript de déclarations en C# 2.0. La bibliothèque libre Jint est en mesure de le faire. C'est un interpréteur Javascript pour .NET. Passer d'un programme Javascript et il sera exécuté à l'intérieur de votre application. Vous pouvez même passer à C# de l'objet en tant qu'arguments et de faire de l'automatisation sur elle.
Aussi, si vous voulez juste pour évaluer l'expression de vos propriétés, essayez de donner une de NCalc.
Vous pouvez utiliser la réflexion pour obtenir la propriété et à l'appeler. Quelque chose comme ceci:
Qui est, en supposant que l'objet qui a la propriété est appelé "theObject" 🙂
Vous pourriez également mettre en œuvre un Webbrowser, puis chargez un html-fichier qui contient du code javascript.
Alors u aller pour le
document.InvokeScript
Méthode sur ce navigateur. La Valeur de retour de la fonction eval peut être capté et transformé en tout ce dont vous avez besoin.Je l'ai fait dans plusieurs Projets et il fonctionne parfaitement.
Espère que cela aide
Vous pourriez le faire avec un prototype de la fonction:
et ainsi de suite...
Utilise la réflexion pour analyser et évaluer une expression de liaison de données à l'encontre d'un objet au moment de l'exécution.
DataBinder.Méthode Eval
J'ai écrit un paquet, SharpByte.Dynamique, afin de simplifier la tâche de compilation et de l'exécution de code dynamique. Le code peut être invoqué à un objet de contexte à l'aide de méthodes d'extension détaillé ici.
Par exemple,
renvoie 3;
retourne le contexte de l'objet de représentation sous forme de chaîne;
d'exécution de ces déclarations comme un script, etc.
Exécutables peut être obtenu facilement à l'aide d'une méthode de fabrique, comme on le voit dans l'exemple ici--tous vous avez besoin est le code source et la liste de tout les paramètres nommés (les jetons sont intégrés à l'aide de triple-support de la notation, comme {{{0}}} afin d'éviter les collisions avec de la ficelle.Format() ainsi que le Guidon comme syntaxes):
Chaque objet exécutable (script ou de l'expression) est thread-safe, peut être stockée et réutilisée, prend en charge la journalisation de l'intérieur d'un script, stocke des informations de synchronisation et dernière exception si rencontrées, etc. Il y a aussi une Copie() la méthode compilé sur chacun afin de permettre la création de copies bon marché, c'est à dire à l'aide d'un objet exécutable compilé à partir d'un script ou d'une expression comme modèle pour créer d'autres.
Généraux de l'exécution d'un script compilé ou de la déclaration est relativement faible, à moins d'une microseconde sur du matériel modeste, et déjà compilé des scripts et expressions sont mises en cache pour la réutilisation.
J'ai essayé d'obtenir une valeur d'une structure (classe) membre par son nom. La structure n'était pas dynamique. Toutes les réponses n'ont pas de travail jusqu'à ce que j'ai finalement obtenu:
Cette méthode retourne la valeur du membre par son nom. Il fonctionne sur la structure régulière (de classe).
Vous devriez vérifier la Heleonix.La réflexion de la bibliothèque. Il donne des méthodes get/set/invoke membres de façon dynamique, y compris les membres imbriqués, ou si un membre est clairement définie, vous pouvez créer un getter/setter (lambda compilé dans un délégué) qui est plus rapide que la réflexion:
Ou si le nombre de propriétés n'est pas sans fin, vous pouvez générer des setters et chache eux (les setters sont rapides car ils sont compilés délégués):
Setters peuvent être de type
Action<object, object>
mais des cas peut être différent au moment de l'exécution, de sorte que vous pouvez créer des listes de poseurs.Malheureusement, C# n'ont pas natif des installations pour faire exactement ce que vous demandez.
Cependant, mon C# eval programme ne permet pour l'évaluation de code C#. Il prévoit l'évaluation de code C# au moment de l'exécution et prend en charge de nombreux C# consolidés. En fait, ce code n'est utilisable qu'à l'intérieur de tout .Un projet de réseau, cependant, elle est limitée à l'aide de la syntaxe C#. Jetez un oeil à mon site web, http://csharp-eval.com, pour plus de détails.
la bonne réponse est que vous devez en cache le résultat de garder le mem0ry utilisation faible.
un exemple ressemblerait à ceci
et l'ajouter à une Liste
enregistrer l'id et l'utiliser dans le code
espère que cette aide