2010-08-10 5 views
4

J'essaie d'éviter un type dynamique dans mon expression lambda pour regrouper une collection. Le type est défini de manière anonyme à la compilation (et sans ambiguïté pour autant que je sache). Je préfère ne pas définir le type comme une classe à part car je ne l'utilise que quelques fois dans cette méthode unique.Définition d'une expression lambda avec un type anonyme contenu dans ce lambda

Exemple de code:

Func<MyData, dynamic> dataGrouping = md => new 
    { 
     md.Property1, 
     md.Property2, 
     md.Property3 
    }; 

var groupedData = myDataCollection.GroupBy(dataGrouping); 

Bien que cela compilera, il me laisse sans IntelliSense ou en tapant forte à l'intérieur du groupe que le type est dynamique.

Je ne peux pas spécifier le type de dataGrouping en tant que var, car je suis en C# et je reçois des plaintes de Impossible d'affecter l'expression lambda à la variable locale implicitement typée. Puis-je remplacer dynamic par le résultat de GetType() sur le type anonyme?

J'aurais alors besoin du type avant qu'il ne soit utilisé dans le lambda, mais je ne vois pas de moyen utile de le maîtriser avant que je ne sois déjà dans le lambda lui-même.

Existe-t-il un moyen élégant d'obtenir le type de cette classe anonyme?

Répondre

4

Y a-t-il une raison pour laquelle vous ne voulez pas mettre directement l'expression lambda dans l'appel GroupBy? Voilà la façon dont tout cela se bloque habituellement ensemble:

var groupedData = myDataCollection.GroupBy(md => new 
         { 
          md.Property1, 
          md.Property2, 
          md.Property3 
         }); 

Vous pouvez faire ce travail avec une méthode supplémentaire:

static Func<TSource, TResult> CreateFunction<TSource, TResult> 
    (Func<TSource, TResult> function) 
{ 
    return function; 
} 

et utiliser l'inférence de type:

var dataGrouping = CreateFunction((MyData md) => new 
{ 
    md.Property1, 
    md.Property2, 
    md.Property3 
}); 

Notez comment J'ai explicitement tapé le paramètre de sorte que l'inférence de type a quelque chose à travailler avec. Ça va marcher, mais c'est un peu moche. Je voudrais intégrer l'expression lambda directement dans l'appel de méthode, sauf si vous avez une raison particulière de ne pas le faire.

+0

Précisément ce que j'allais suggérer ... mais vous avez une longueur d'avance, comme d'habitude;) –

+0

Merci pour la réponse. La raison pour laquelle je ne veux pas mettre le lambda directement dans le GroupBy est que j'ai l'intention d'utiliser ce groupement sur plusieurs collections différentes de MyData dans cette fonction, et j'essayais de le définir une seule fois. –

+0

@Daniel: assez bien. Dans ce cas, l'approche «méthode supplémentaire» devrait fonctionner, même si c'est un peu moche. –