Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[ASP.NET/C#] Referentie naar statische instanties

Pagina: 1
Acties:

  • PressPlayOnTape
  • Registratie: Augustus 2012
  • Laatst online: 12:22

PressPlayOnTape

Loading.. Ready... Run!

Topicstarter
Heren (en dames) ontwikkelaars,

Ik ben inmiddels al anderhalve dag bezig met een probleem waar ik niet uit kom en waarvan ik niet begrijp waarom het doet wat het doet.

De situatie is als volgt: ik wil vanuit code-behind bestanden (JavaScript/CSS) toevoegen aan een pagina en heb daarvoor een extensie geschreven die dit regelt. De extensie accepteert een parameters array van het type EFile.

In deze klasse EFile zijn diverse statische instanties opgenomen die aangeroepen kunnen worden. Een instantie van EFile beschikt over een string FileContent, met daarin de inhoud van het bestand en een List<EFile> Dependencies die een lijst bevat van andere EFiles, waarvan de instantie afhankelijk is.

Als ik vervolgens een meegegeven instantie van EFile uitlees binnen de extensie, dan bevat de lijst Dependencies wel het aantal objecten dat ik verwacht, maar alle objecten zijn dan null en ik begrijp niet waarom.

Hieronder volgt code ter verduidelijking en als voorbeeld:

De aanroep van de extensie. Als voorbeeld wil ik hier dus de bestanden die behoren bij EFile.ImageUpload toevoegen aan de pagina:
C#:
1
2
3
4
    private void Page_LoadComplete(object sender, EventArgs e)
    {
        Page.AddFiles(EFile.ImageUpload);
    }


De klasse EFile, waar de statische instanties staan beschreven. In het geval van ImageUpload betekent dit dus dat deze 2 afhankelijkheden heeft, namelijk naar JQueryJCrop en JQueryJColor.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public class EFile
    {
        public string FileContent { get; private set; }
        public List<EFile> Dependencies { get; private set; }
        
        private EFile(string file, params EFile[] dependencies)
        {
            FileContent = file;
            Dependencies = new List<EFile>(dependencies);
        }

        public static readonly EFile ImageUpload = new EFile(Resources.ImageUpload, EFile.JQueryJCrop, EFile.JQueryJColor);
        private static readonly EFile JQueryJCrop = new EFile(Resources.JQueryJCrop);
        private static readonly EFile JQueryJColor = new EFile(Resources.JQueryJColor);
    }


De extensie zelf, waarbij het probleem zich voordoet in GetAllFilesIncludingDependendFiles. De check file.Dependencies.Count op regel 16 geeft hier in dit voorbeeld dus wel aan 2 objecten te bevatten, maar beide objecten zijn null.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public static void AddFiles(this Page input, params EFile[] files)
    {   
        var scripts = GetAllFilesIncludingDependendFiles(new List<EFile>(files));
        if (scripts.Count > 0)
            input.Controls.Add(GetScript(scripts));
    }

    private static List<EFile> GetAllFilesIncludingDependendFiles(List<EFile> files)
    {
        var allFiles = new List<EFile>();

        foreach (var file in files)
        {
            allFiles.Add(file);

            if (file.Dependencies.Count > 0)
                allFiles.AddRange(GetAllFilesIncludingDependendFiles(file.Dependencies));
        }

        return allFiles;
    }


Voor de duidelijkheid heb ik enkel relevante code geplaatst. De klasses die gebruikt worden zijn uitgebreider, maar het probleem doet zich op dit vereenvoudigde niveau ook voor. Wellicht dat het te maken heeft met mijn beperkte kennis, dus ik hoop dat iemand mij kan wijzen op de fout die ik maak. Ik heb geprobeerd te googlen op dit probleem, maar zoals ook al af te leiden uit de titel van dit topic, kan ik het probleem moeilijk in beperkte woorden omschrijven.

You know, I rather like this God fellow. He’s very theatrical. A little pestilence here, a plague there... Omnipotence...got to get me some of that.


  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Zet je definitie van:

C#:
1
public static readonly EFile ImageUpload = new EFile(Resources.ImageUpload, EFile.JQueryJCrop, EFile.JQueryJColor); 


eens onder de JQueryJCrp en JQueryJColor definitie..

Wat er gebeurd is dat de statische variabelen worden @ runtime geinitialiseerd in de volgorde waarin ze gedefinieerd staan. M.a.w je bent al de JQuery afhankelijkheden toe aan het voegen aan de imageupload variabele, voordat ze uberhaupt geinitialiseerd zijn, dus voeg je NULL references toe.

  • PressPlayOnTape
  • Registratie: Augustus 2012
  • Laatst online: 12:22

PressPlayOnTape

Loading.. Ready... Run!

Topicstarter
D-Raven schreef op vrijdag 01 februari 2013 @ 12:43:
Zet je definitie van:

C#:
1
public static readonly EFile ImageUpload = new EFile(Resources.ImageUpload, EFile.JQueryJCrop, EFile.JQueryJColor); 


eens onder de JQueryJCrp en JQueryJColor definitie..

Wat er gebeurd is dat de statische variabelen worden @ runtime geinitialiseerd in de volgorde waarin ze gedefinieerd staan. M.a.w je bent al de JQuery afhankelijkheden toe aan het voegen aan de imageupload variabele, voordat ze uberhaupt geinitialiseerd zijn, dus voeg je NULL references toe.
Dat was hem inderdaad! Het was me al even vluchtig door het hoofd gespookt, maar ik kon me niet voorstellen dat de volgorde van invloed kon zijn in dit geval of dat de compiler daar geen rekening mee zou houden.

Dank u hartelijk!

You know, I rather like this God fellow. He’s very theatrical. A little pestilence here, a plague there... Omnipotence...got to get me some of that.