Accès aux objets de type C # Anonymous
Comment puis-je accéder à des objets d'un type anonyme en dehors de la portée où ses déclarée?
pour, par exemple,
void FuncB()
{
var obj = FuncA();
Console.WriteLine(obj.Name);
}
??? FuncA()
{
var a = (from e in DB.Entities
where e.Id == 1
select new {Id = e.Id, Name = e.Name}).FirstOrDefault();
return a;
}
source d'informationauteur Ali Kazmi
Vous devez vous connecter pour publier un commentaire.
Que les autres réponses ont indiqué, vous ne devriez vraiment pas faire ce. Mais, si vous insistez, alors il y a un méchant hack connu comme le "cast par exemple" qui va vous permettre de le faire. La technique est mentionné dans un couple des articles, ici et ici.
(Je ne peux pas prendre le crédit pour ce hack, bien que l'auteur de l'un de ces articles dit qu'il ne veut pas être associé avec. Son nom pourrait être familier.)
Vous ne pouvez pas retourner un type anonyme à partir d'une fonction.
De la La documentation MSDN:
Si vous êtes en utilisant .NET 4.0, vous pouvez utiliser les Tuples pour cela, vous seriez de retour d'un
Tuple<int, string>
. Vous pouvez implémenter votre propre Tuples pour 2.0/3.5, et effectivement d'autres personnes l'ont déjà, donc vous devriez être en mesure de le faire si vous le souhaitez.Anonyme type est juste un générées par le compilateur de la classe, et le compilateur n'est pas disposé à vous dire le nom de la classe elle-même. Par conséquent, il n'y a aucun moyen que vous pouvez retourner une instance de cette classe à partir d'une fonction autre que de retourner une référence à un
object
.Bien, je pense que la réponse est: Ne pas utiliser un type anonyme en dehors de la portée où elle le déclare. Dans ce cas, créer un type simple.
Le framework open source Impromptu-Interface vous permettra de canard effectuer un cast d'un objet anonyme à une interface. Il a l'avantage d'être moins hacky parce qu'il fonctionne comme prévu à travers l'assemblée des limites. Il y parvient à l'aide d'un léger proxy et le dlr.
serait de créer une classe pour ce cas:
alors: