8
votes

C # LINQ Projection de type anonyme sur une interface

est-il possible de projeter à l'aide d'un type sélectionné sur un type anonyme?

Voici quelques exemples de code p> xxx pré>

Le code ci-dessus provoque un P>

ne peut pas convertir implicitement le type 'system.linq.iquefery' vers 'system.linq.iférable' p> blockQuote>

Remarque: je peux faire fonctionner le code ci-dessus si je pouvais définir un test de classe qui implémente l'itest, puis le projet dans cette classe en utilisant: P>

select   new Test {A = n.ToUpper(), B = 2012};


3 commentaires

Pourquoi voulez-vous un résultat iquéryable et non un iEnumerable un?


J'essaie de voir si je ne peux que définir l'interface et ne pas avoir à définir la mise en œuvre concrète ... sans une génération de code dynamique, cela n'arrivera pas comme ça. Vous DOIT Avoir un objet concret. Vous aurez soit un type de béton de temps compilé, soit un type généré d'exécution.


Iquérissable parce que dans la réalité, je vais après une base de données. Le code ci-dessus était tout comme un exemple


3 Réponses :


0
votes

Vous ne pouvez pas, car les types anonymes ne mettent pas en œuvre des interfaces.

Vous devez créer une classe pour cela.

Une option peut être le Projet de typage de canard qui essentiellement Génère une classe d'emballage au moment de l'exécution (et vient donc une pénalité à la performance et à la consommation de mémoire)

(juste pour référence, les types anonymes sont réels, des classes concrètes, générées par le compilateur C #. Le .NET Runtime lui-même ne les supporte pas. Le compilateur C # ne vous permet pas de modifier comment il génère ces classes. Je n'ai pas J'ai essayé de voir si ROSLYN pourrait aider ici.)


2 commentaires

Vous pouvez également créer cette classe à l'exécution. Et d'après ce que j'ai entendu, l'Incarnation actuelle de Roslyn est complètement passive.


@CodeInchaos Très vrai, il suffit d'ajouter un lien vers le projet de typage du canard qui fait exactement cela. Je ne recommande vraiment pas d'utiliser des générations de classe d'exécution pour des types que le développeur contrôle cependant, mais c'est une option en effet.



3
votes

Vous ne pouvez pas faire cela directement avec des objets anonymes, mais vous pouvez réaliser quelque chose de très similaire avec le Clay framework: xxx


0 commentaires

5
votes

Oui, vous pouvez sélectionner un type anonyme, mais vous ne pouvez pas simplement sélectionner un type anonyme, puis utiliser ces objets comme si elles implémentaient une interface. La raison en est que le type anonyme ne met pas en œuvre l'interface même s'ils ont les mêmes propriétés, dans le type et le nom. Il n'y a pas de moyen de définir qu'un type anonyme implémente une interface. Si vous souhaitez utiliser des objets via leurs implémentations d'interface, vous devez sélectionner un type concret qui implémente cette interface.

Les types anonymes sont des types de classe qui dérivent directement de l'objet, ce qui ne peut pas être coulé à aucun type sauf objet. Le compilateur fournit un nom pour chaque type anonyme, bien que votre application ne puisse y accéder. Du point de vue de la langue courante, un type anonyme n'est pas différent de tout autre type de référence.

ref: http://msdn.microsoft.com/ EN-US / Bibliothèque / BB397696.aspx

Je peux certainement sympathiser avec votre intention ici. Ce serait bien si le compilateur pouvait avoir une intuition que le type répond à la définition de l'interface lorsque le type est anonyme, mais ce n'est vraiment applicable que lorsque l'interface consiste à se comporter strictement de propriétés en lecture seule. La minute Votre interface définit les propriétés avec des setters ou des méthodes, il n'est pas possible pour un type anonyme de la mettre en œuvre. D'autre part, si vous utilisez le type anonyme tel qu'il est prévu - comme un type temporaire à court terme d'une utilisation particulière - vous pouvez simplement référencer ses propriétés et que vous n'avez pas besoin de l'interface du tout. xxx


1 commentaires

"Vous pouvez simplement référencer ses propriétés et vous n'avez pas besoin de l'interface du tout." - Je ne peux pas faire cela, car la méthode doit renvoyer les objets neutres. (Cela fait partie de la DAL et je vais contre une base de données, pas un tableau statique). J'essayais simplement de déterminer si je pouvais être paresseux et que je m'éloigne sans avoir à créer la classe! Votre réponse a du sens - je ne peux pas!