J'ai une classe qui ressemble à ceci:
public class Field
{
public string FieldName;
public string FieldType;
}
Et un objet List<Field>
avec des valeurs:
{"EmployeeID","int"},
{"EmployeeName","String"},
{"Designation","String"}
Je veux créer une classe qui ressemble à ceci:
Class DynamicClass
{
int EmployeeID,
String EmployeeName,
String Designation
}
Y a-t-il un moyen de faire ça?
Je veux que cela soit généré au moment de l'exécution. Je ne veux pas qu'un fichier CS physique réside dans mon système de fichiers.
c#
.net
reflection.emit
dynamic-class-creation
ashwnacharya
la source
la source
System.ServiceModel.ChannelFactory<MyDynamicInterface>
Réponses:
Oui, vous pouvez utiliser
System.Reflection.Emit
espace de noms pour cela. Ce n'est pas simple si vous n'en avez aucune expérience, mais c'est certainement possible.Edit: Ce code peut être imparfait, mais il vous donnera une idée générale et, espérons-le, un bon départ vers l'objectif.
la source
Il faudra du travail, mais ce n'est certainement pas impossible.
Ce que j'ai fait c'est:
Microsoft.CSharp.CSharpCodeProvider
(CompileAssemblyFromSource)Activator.CreateInstance
)De cette façon, vous pouvez gérer le code C # que vous connaissez déjà, au lieu d'avoir à émettre MSIL.
Mais cela fonctionne mieux si votre classe implémente une interface (ou est dérivée d'une classe de base), sinon comment le code appelant (lire: compilateur) doit-il connaître cette classe qui sera générée lors de l'exécution?
la source
Vous pouvez également créer dynamiquement une classe à l'aide de DynamicObject .
Je stocke tous les champs de classe dans un dictionnaire
_fields
avec leurs types et valeurs. Les deux méthodes permettent d'obtenir ou de définir la valeur de certaines propriétés. Vous devez utiliser ledynamic
mot clé pour créer une instance de cette classe.L'utilisation avec votre exemple:
Edit: Et voici à quoi ressemble ma classe
Field
:la source
dynamic obj = new DynamicClass(fields){EmployeeId=123456;EmployeeName = "John"; Designation = "Tech Lead";}
ce serait vraiment bien de faire ça.Je ne connais pas l'utilisation prévue de ces classes dynamiques, et la génération de code et la compilation au moment de l'exécution peuvent être effectuées, mais cela demande un certain effort. Peut-être que les types anonymes vous aideraient, quelque chose comme:
la source
Field.FieldName
. Le fait de devoir coder en dur les noms de champ va à l'encontre de l'objectif. Si vous devez le faire, vous pourriez aussi bien créer la classe.Je sais que je rouvre cette ancienne tâche mais avec c # 4.0 cette tâche est absolument indolore.
pour plus d'informations, voir https://www.oreilly.com/learning/building-c-objects-dynamically
la source
Vous voulez regarder CodeDOM . Il permet de définir des éléments de code et de les compiler. Citant MSDN:
la source
Sur la base de la réponse de @ danijels, créez dynamiquement une classe dans VB.NET:
la source
Vous pouvez également créer dynamiquement une classe en utilisant DynamicExpressions .
Étant donné que les dictionnaires ont des initialiseurs compacts et gèrent les collisions de touches, vous voudrez faire quelque chose comme ça.
Ou vous voudrez peut-être utiliser un convertisseur JSON pour construire votre objet chaîne sérialisé en quelque chose de gérable.
Puis en utilisant System.Linq.Dynamic;
Le reste utilise simplement System.Reflection.
la source
Pour ceux qui veulent créer une classe dynamique, juste des propriétés (c'est-à-dire POCO), et créer une liste de cette classe. En utilisant le code fourni plus tard, cela créera une classe dynamique et en créera une liste.
Voici les classes utilisées par le code précédent.
Remarque: Vous devrez également référencer la bibliothèque Microsoft.CodeAnalysis.CSharp.
la source
Vous pouvez envisager d'utiliser des modules et des classes dynamiques qui peuvent faire le travail. Le seul inconvénient est qu'il reste chargé dans le domaine d'application. Mais avec la version du framework .NET utilisée, cela pourrait changer. .NET 4.0 prend en charge les assemblys dynamiques de collection et vous pouvez donc recréer les classes / types de manière dynamique.
la source
Hou la la! Merci pour cette réponse! Je lui ai ajouté quelques fonctionnalités pour créer un convertisseur "datatable to json" que je partage avec vous.
Et dans le sous "compileresulttype", j'ai changé cela:
la source
Vous pouvez utiliser System.Runtime.Remoting.Proxies.RealProxy. Il vous permettra d'utiliser du code "normal" plutôt que des trucs de type assembleur de bas niveau.
Voir la réponse RealProxy à cette question pour un bon exemple:
Comment intercepter un appel de méthode en C #?
la source
Runtime Code Generation with JVM and CLR
- Peter SestoftTravaillez pour des personnes vraiment intéressées par ce type de programmation.
Mon conseil pour vous est que si vous déclarez quelque chose, essayez d'éviter la chaîne, donc si vous avez un champ Field, il est préférable d'utiliser la classe System.Type pour stocker le type de champ plutôt qu'une chaîne. Et dans l'intérêt des meilleures solutions au lieu de créer de nouvelles classes, essayez d'utiliser celles qui ont été créées FiledInfo au lieu de créer de nouvelles.
la source