Zugreifen auf anonyme C # -Typobjekte

Wie greife ich auf Objekte eines anonymen Typs außerhalb des Geltungsbereichs zu?

für z

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; } 

Wie die anderen Antworten gesagt haben, sollten Sie das wirklich nicht tun . Aber, wenn Sie darauf bestehen, dann gibt es einen bösen Hack, der als “Cast by Example” bekannt ist und Ihnen erlauben wird, dies zu tun. Die Technik wird in einigen Artikeln hier und hier erwähnt .

 public void FuncB() { var example = new { Id = 0, Name = string.Empty }; var obj = CastByExample(FuncA(), example); Console.WriteLine(obj.Name); } private object FuncA() { var a = from e in DB.Entities where e.Id == 1 select new { Id = e.Id, Name = e.Name }; return a.FirstOrDefault(); } private T CastByExample(object target, T example) { return (T)target; } 

(Ich kann den Kredit für diesen Hack nicht in Anspruch nehmen, obwohl der Autor eines dieser Artikel sagt, dass er auch nicht damit verbunden sein will . Sein Name ist vielleicht bekannt.)

Sie können einen anonymen Typ nicht von einer function zurückgeben.

Aus der MSDN-Dokumentation :

Um einen anonymen Typ oder eine Sammlung mit anonymen Typen außerhalb einer Methodengrenze zu übergeben, müssen Sie den Typ zuerst in ein Objekt umwandeln. Dies verhindert jedoch die starke Typisierung des anonymen Typs. Wenn Sie Ihre Abfrageergebnisse speichern oder sie außerhalb der Methodengrenze übergeben müssen, sollten Sie eine normale benannte Struktur oder class anstelle eines anonymen Typs verwenden.

Wenn Sie .NET 4.0 verwenden, können Sie hierfür Tupel verwenden. Sie geben ein Tupel Tuple . Sie können Ihre eigenen Tupel für 2.0 / 3.5 implementieren, und tatsächlich haben andere Leute bereits, also sollten Sie das tun können, wenn Sie möchten.

Der anonyme Typ ist nur eine vom Compiler generierte class, und der Compiler ist nicht bereit, Ihnen den Namen der class selbst zu nennen. Daher gibt es keine Möglichkeit, eine Instanz dieser class von einer anderen function als dem Zurückgeben einer Referenz an ein object .

Nun, ich denke, die Antwort lautet: Verwenden Sie keinen anonymen Typ außerhalb des Bereichs, in dem er deklariert wurde. In diesem Fall erstellen Sie einen einfachen Typ.

Das Open-Source-Framework Impromptu-Interface ermöglicht es Ihnen, ein anonymes Objekt an eine Schnittstelle zu entkernen. Es hat den Vorteil, weniger hacky zu sein, weil es über die Grenzen hinweg funktioniert. Es erreicht dies mit einem Lightweight Proxy und der DLR.

würde eine class für diesen Fall erstellen:

 public class LISTFUNCA { public int identificacion; public string nombre; } 

dann:

 public List FuncA() { var lista = (from e in DB.Entities where e.Id == 1 select new { identificacion = e.Id, nombre = e.Name}) .FirstOrDefault(); return lista.ToList(); }