Créer une expression lambda avec un nouveau type anonyme au moment de l'exécution
Je veux appeler une méthode qui attend un paramètre comme ceci:
Expression<Func<sometype, 'a>> expr
J'ai besoin pour la construction de ce paramètre lors de l'exécution, parce que je ne sais pas quel est le type anonyme va ressembler avant; il pourrait avoir n'importe quel nombre de champs:
x => new { a=x.a, b=x.b, c=x.c, etc... }
Je peux créer un type à l'exécution qui a la même "signature" (Est-ce le bon mot?) que l'anonyme de type, mais la question est: Comment dois-je construire cette expression lambda au moment de l'exécution? Plus Particulièrement L'Expression.La nouvelle est m'énerve, parce que j'ai besoin de passer un constructorInfo à ce que je l'obtenir à partir d'un type (qui peut en effet être un type anonyme, mais je ne peux pas créer un type anonyme au moment de l'exécution. Ou est-il un moyen de le faire?).
Mise à jour (contexte, comme demandé dans les commentaires)
La méthode que je veux invoquer est:
DependentNavigationPropertyConfiguration.HasForeignKey<TKey>(Expression<Func<TDependentEntityType, TKey>> foreignKeyExpression)
La raison pour laquelle je veux faire, c'est de faire automatiquement une propriété de navigation à une entité qui hérite d'une certaine classe de base comprennent la clé de cette classe de base dans la clé étrangère. Parce qu'une entité peut avoir plusieurs champs de clé de tout type, le type TKey n'est connu que de moi au moment de l'exécution.
Lors de l'exécution d'un certain nombre de champs sont sélectionnés à partir de 'sometype'. J'ai besoin de construire l'expression. Les noms des champs de la anonyme de type sont les mêmes que les champs qui ont été sélectionnés à partir de 'sometype'.
Pourquoi le downvote? Veuillez expliquer afin que je puisse apprendre un jour.
OriginalL'auteur EPLKleijntjens | 2013-05-30
Vous devez vous connecter pour publier un commentaire.
Utiliser une autre méthode:
Noter, cependant, que le point de départ de type (dans mon exemple
String
) doit être connu avant.Mise à jour:
Depuis qu'il semble que vous essayez de faire est de créer dynamiquement un type, je vais vous donner un exemple simple de la façon de le faire.
Comme vous pouvez le voir, c'est un peu plus compliqué. Si vous voulez étudier le sujet plus loin cependant, certainement référence
Reflectoin.Emit
.Oh, je vois. Donc, la chose est, un type anonyme est une fonctionnalité de compilateur, qui est, lorsque vous écrivez un anonyme, le compilateur construit en fait à une classe spécifique avec un nom aléatoire (dans mon exemple
<>f__AnonymousType0'2
). Donc vous ne pouvez pas vraiment facilement créer un type anonyme au moment de l'exécution. Vous pourriez vous en sortir avec l'aide deExpression.New
, mais qui nécessite un constructeur, ce qui implique qu'elle doit être d'un type existant. Vous pouvez définir un type de contourner cela, mais c'est vraiment une toute autre question. Si vous voulez, je peux écrire un exemple.Mise à jour de la réponse.
Merci encore pour votre problème. Je sais comment créer le type j'ai besoin de l'aide de la réflexion, mais le problème est que, en utilisant ce type, je ne peux pas créer une expression qui crée un nouveau type anonyme. J'ai ajouté un peu de contexte à ma question initiale. Si j'invoque la méthode mentionnée avec une expression créée à partir d'un nouveau type, grâce à la réflexion, j'obtiens une exception de me dire le type de l'expression ne convient pas, car il attend une expression de propriété ou un avec un type anonyme...
Ce que je veux dire c'est que je peux créer cette expression: x=>nouvelle MyAnonymousType() {a=x.a, b=x.b}, mais je ne peux pas créer de x=>new {a=x.a, b=x.b} La méthode que je suis en train d'invoquer attend le deuxième type de l'expression (sans type explicite).
OriginalL'auteur sircodesalot
Les types anonymes sont une fonctionnalité de compilateur. Si vous n'obtenez pas le compilateur pour créer au moment de la compilation, alors vous aurez à utiliser les méta-programmation - soit
TypeBuilder
ou peut-êtreCSharpCodeProvider
. Vous pourriez être mieux à l'aide de n-uplets - au moins, ils sont faciles à créer (vous pouvez utiliserTuple.Create
assez facilement).Comme pour l'expression, je suggère de le taper comme
Expression<Func<sometype, object>>
- qui va travailler pour toute formulation. Le code l'inspection laExpression
peut bien sûr voir ce que le type réel est.OriginalL'auteur Marc Gravell
vous pouvez le faire tout simplement comme ce
Vous pouvez obtenir un type anonyme au moment de l'exécution, sans avoir à remplir les données dans un type connu. Peut-être pas très pertinent à la question, mais utile
Il est important de comprendre, que
new
des déclarations comme dans votre exemple ne sont pas la création de types anonymes à compilation. C'est pourquoi cette réponse n'a rien à voir avec la question et, par conséquent, n'est pas utile à tous.OriginalL'auteur Shahid Iqbal