2010-10-26 23 views
5

Często potrzebuję na przykład powiększyć obiekt o właściwość. Do tej pory (zmęczony;) ​​i to zbyt brzydki) Zrobiłem to w ten sposób:Jak ulepszyć obiekt anonimowy w C#

var someListOfObjects = ...; 

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           o.Name, /* Just copying all the attributes I need */ 
           o.Address, /* which may be all of them. */ 

           SomeNewProperty = value 
          }; 

Czy jest to sprytny sposób to zrobić? Co mam zrobić wcześniej coś takiego:

var objectsWithMyProperty = from o in someListOfObjects 
          select new 
          { 
           OldObject = o,   /* I access all of the old properties from here */  
           SomeNewProperty = value 
          }; 

Chyba można to zrobić z niektórych refleksji, ale wyobrażam sobie, że jest szybsze podejście, które sprawia, że ​​coś równoważnego do pierwszego uciążliwego podejścia.

Dzięki Lasse

+0

Zgaduję, że można podać fantazyjne drzewo wyrażeń. Ale prawdopodobnie nie będzie działać dla Linq2SQL i przyjaciół. – leppie

+0

Na czym polega problem z drugim podejściem? –

+0

@Pieter Myślę, że to jest brzydkie i nie ma sensu w kontekście, w którym go używam. Fx, jeśli podasz go jako źródło danych, otrzymasz "Eval (" WhyDoIHaveToHaveANameHere.TheActualProperty ")'. –

Odpowiedz

3

myślę co szukasz jest coś takiego jak ExpandoObject, który został dodany w C# 4.0, wraz z dynamicznym typu

http://msdn.microsoft.com/en-us/magazine/ff796227.aspx

Wewnętrznie używa słownika, dzięki czemu można dodawać/usuwać członków dynamicznie. Przy pierwszej próbie uzyskania dostępu do usługi takiej jak:

obj.NewProperty = newValue 

obiekt ExpandoObject automatycznie doda to do swojego słownika wewnętrznego.

Mam nadzieję, że to pomoże.

+0

Teraz wspominasz o "ExpandoObject". Przypominam sobie, że mam czasopismo, do którego linkujesz. Wolałbym statyczne rozwiązanie, ale dynamika jest lepsza niż żadna :) Dzięki ... –

4

No nie ma wsparcia dla dołączania nowych właściwości do istniejącego typu anonimowego. Anonimowe wyrażenie typu można użyć tylko do utworzenia zupełnie nowego anonimowego typu o określonych właściwościach. Dwie najlepsze alternatywy do dołączania nowych właściwości są wymienione w pytaniu.

+0

To źle :(Dzięki ... :) –

Powiązane problemy