Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
Enten laver du en default constructor på kunde som sørger for at _kundeid altid bliver assignet, eller også kalder du specifikt den rette constructor i din test klasse.
Med lidt mindre ændringer kalder du constructoren, som sørger for at lave en instans af Kunde i din test klasse.
public Form1() { InitializeComponent();
Test test = new Test(); MessageBox.Show(test.Kunde.Id.ToString()); }
public class Kunde { private int kundeId;
public Kunde(int id) { this.kundeId = id; }
public int Id { get { return this.kundeId; } set { this.kundeId = value; } } }
public class Test { private Kunde kunde = new Kunde(1234);
public Kunde Kunde { get { return kunde; } } }
Nb! det er en god ide at følge navngivningsstandarder. f.ek. bør dine klassenavne være med stort forbogstav, og dine medlems variable med lille. Ellers er det svært at se forskel i din kode.
Det kan godt være at min forklaring blev lidt forvirrende, men altså... Den egentlige fejlårsag er at du mangler at kalde constructoren på din Kunde klasse (i din test klasse).
Det mangler du at tage højde for selv. Du bør lave en constructor på din test klasse, som kan tage kunde Id.
Se følgende eksempel:
public class Kunde { private int kundeId;
/// <summary> /// Opretter en instans af kunde uden angivelse af Id. /// </summary> public Kunde() { this.kundeId = -1; }
/// <summary> /// Opretter en instans af kunde med angivelse af kunde Id. /// </summary> /// <param name="id">Kundens Id nummer.</param> public Kunde(int id) { this.kundeId = id; }
/// <summary> /// Returnerer eller sætter kundens Id. /// </summary> public int Id { get { return this.kundeId; } set { this.kundeId = value; } } }
public class Test { private Kunde kunde;
public Test() { this.kunde = new Kunde(); }
public Test(int id) { this.kunde = new Kunde(id); }
public Kunde Kunde { get { return this.kunde; } } }
private void button1_Click(object sender, EventArgs e) { Test test2 = new Test(int.Parse(this.textBox1.Text)); MessageBox.Show(test2.Kunde.Id.ToString()); }
Egentligt kan du undlade din testklasse, da det eneste den gør er at lave en ny kunde. Men du har nok en bagtanke med denne klasse så jeg har beholdt den i eksemplet.
Mit eksempel er udvidet en smule. Kunde har nu to constructorer. Den ene uden argumenter opretter en kunde med kundeId -1 (hvis man har behov for dette, ellers kan den blot slettes). Den anden tager et Kunde Id. Samme constructorer er replikeret til test klassen.
Du bør lave en constructor på din form2 som tager din kunde. Noget i stil med:
public Form2(Kunde kunde) : this() { this.kunde = kunde; }
this() kalder den defaulte constructor som indeholder kaldet til InitializeComponent(). Med andre ord, hvis din nye constructor ikke kalder this() må du duplikere denne linie kode.
I din form2 har du en label som skal vise kundens Id..
this.label1.Text = this.kunde.Id.ToString();
Du kan indsætte denne linie i din constructor, i FormLoad eller når du trykker på enknap.
Vedr. -1, så var det blot et eksempel på flere constructorer. Hvis dette ikke passer ind i din løsning kan du blot udelade constructoreren som ikke tager parametre.
/// <summary> /// Opretter en instans af kunde med angivelse af kunde Id. /// </summary> /// <param name="id">Kundens Id nummer.</param> public Kunde(int id) { this.kundeId = id; }
/// <summary> /// Returnerer eller sætter kundens Id. /// </summary> public int Id { get { return this.kundeId; } set { this.kundeId = value; } } }
public partial class Form1 : Form { public Form1() { InitializeComponent(); }
private void button1_Click(object sender, EventArgs e) { try { Kunde kunde = new Kunde(int.Parse(this.textBox1.Text));
Form2 form2 = new Form2(kunde); form2.ShowDialog(); } catch(FormatException) { MessageBox.Show("Fejl i Kunde ID"); } } }
public partial class Form2 : Form { private Kunde kunde;
private Form2() { InitializeComponent(); }
public Form2(Kunde kunde) : this() { if (kunde == null) { throw new ArgumentNullException("kunde"); }
Ja som jeg skrev tidligere... "this() kalder den defaulte constructor som indeholder kaldet til InitializeComponent(). Med andre ord, hvis din nye constructor ikke kalder this() må du duplikere denne linie kode."
Med andre ord:
public Form2(Kunde kunde) { if (kunde == null) { throw new ArgumentNullException("kunde"); }
this.kunde = kunde;
InitializeComponent(); }
Giver samme resultat, men har du også en constructor uden parametre vil du som minimum have InitializeComponent() som redundant kode, hvilket man jo forsøger at undgå hvis man kan.
Når man skriver: public Form2(Kunde kunde) : this()
resulterer det i at man først kalder constructoren uden parametre. Når denne er færdig med hvad den så en måtte lave (i mit eksempel InitializeComponent()) udføres den aktuelle constructor "Form2(Kunde kunde" som assigner kunde parametren til den private kunde variabel.
Man kan jo skrive kode på mage måder. Mit eksempel anvender constructoren til at overføre Kunde, men du kan også anvende en property til det samme. Det afhænger af hvad du ønsker i din løsning. Derudover har jeg taget mig den frihed at checke lidt for om dine objekter bliver korrekt oprettet.
try { ... } catch(FormatException) { MessageBox.Show("Fejl i Kunde ID"); }
sikrer dig at din tekst som er tastet ind i din tekst streng kan konverteres korrekt. hvis du f.eks. skriver "Åhh Abe" på i din TextBox og trykker på din knap kaster int.Parse en FormatException som fanges med catch(FormatException) og der vises herefteren venlig fejlmeddelelse.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.