[ Boris B. @ 26.01.2011. 10:36 ] @
Imam sledecu situaciju:

Na nekoj klasi imam property Datasource: object koji ocekuje da se postavi na neki IEnumerable<MojItem> ili bilo sta sto provajduje MojItem, standardna situacija. Onda ce glavna klasa da radi nesto kao:
if (DataSource is IEnumerable)
foreach(...)


Meni treba da postavim taj Datasource tako, da svaki put kada se ta klasa referencira na svoj Datasource, da se u stvari "just-in-time" izvrsi moja funkcija koja ce da pripremi svezu listu objekata tipa MojItem.

Edit:
Hteo bih da izbegnem pravljenje novog, treceg objekta i implementiranje IEnumerable interfejsa zbog komplikacija sa prosledjivanjem paramatara, mislio sam na neku magiju sa AsQueryable ili neku closure varijantu.
[ mmix @ 26.01.2011. 12:30 ] @
A sto ti je problem custom IEnumerable, u c# je bar boza napraviti enumerator sa iterator blokovima i yield

Code (csharp):

public class MojEnumeratorWrapper
{
    public static IEnumerable Power(int prvi, int poslednji)
    {
        for(int x = prvi; x<poslednji; x++)
            yield return x;
    }
}
 


iterator block se ne razvija dok ne bude potreban i prekjo njega mozes da napravis sta hoces, pa cak i da neki LINQ query izvrsisi na prvoj iteraciji i onda yieldujes sve redove.
[ Boris B. @ 26.01.2011. 13:02 ] @
Hvala mmix, totalno sam zaboravio na iteratore. To je upravo ta closure-like-magija koju sam trazio.

Moja implementacija IEnumerable je uvek bila samo implemetiranje GetEnumerator da vrati postojeci enumerator od neke liste ili query-ja, nikada do sada mi nije trebalo da implementiram i taj Enumerator.