Avatar billede arnebalsby Nybegynder
14. juli 2010 - 12:58 Der er 12 kommentarer

Hente variabel navnet fra koden (for debuging).

Hej.

Hvordan kan man egentlig inde fra koden finde i at variabel navnet på et object. (det er noget jeg skal bruge til debuging).

Jeg er ret sikker på at man må kunne gøre det vha. noget i System.Diagnostics . ligesom man kan bruge StackTrace til at finde ud af linjenummer m.m.

Men jeg kan ikke finde noget.

?
Avatar billede Syska Mester
14. juli 2010 - 13:06 #1
Tror ikke helt jeg er med på hvad du vil ... du kender vel allerede variable navnet ... kan ikke se hvorfor man ikke skulle kende det.

Du kan jo debug igennem det, og så sætte et break point.

Har du lidt mere info eller måske en bedre forklaring på hvad du vil ... kan også ske det er sommer varmen der har brændt min hjerne af.

mvh
Avatar billede lasserasch Juniormester
14. juli 2010 - 13:19 #2
Jeg læser det som om du gerne vil finde ud af hvilken type dit object er.

I så fald kan du bruge dette eksempel. GetType() retunerer Typen for dit object som du så efterfølgende kan læse name værdien for.

Label lb1 = new Label();
Type t = lb1.GetType();
Console.WriteLine(t.Name);


Mvh.
Lasse
Avatar billede Syska Mester
14. juli 2010 - 13:29 #3
Det ved man jo reelt set også altid, men mindre man laver noget dynamisk loading, og så tror jeg ikke han ville have problemer med at finde typen, hvis man roder med dynamisk load af typer.

Men glæder mig til mere info.

mvh
Avatar billede lasserasch Juniormester
14. juli 2010 - 13:40 #4
Det er helt rigtigt, men jeg læser det bare som om at han skal finde den information via sin kode og ikke "By hand".

Men ja, mere info ville være godt :-)
Avatar billede arne_v Ekspert
14. juli 2010 - 15:18 #5
Hvis spoergsmaalet gaar paa navnet paa variablen, saa kan man ikke finde det (for release version som koerer uden om debugger), fordi efter at vaer kommer gennem C# og JIT compileren saa er den kun en adresse og ikke et navn paa variablen.
Avatar billede Syska Mester
14. juli 2010 - 16:14 #6
også lidt den vej jeg ville med mit spørgmål arnebalsby :-)

Hvis man endelig bruger et navn, så vil man jo også altid kende navnet :-) Og så er meningen lidt væk, så det må være noget andet han prøver at gøre.

mvh
Avatar billede arnebalsby Nybegynder
14. juli 2010 - 17:20 #7
Det er jo ikke sikkert at man kender variable navnet i koden.
Hvis f.eks. man har 10 forskellige collections, og så kalder en metode som bare modtager en generel collection.

Jeg har brug for at kende variabel navnet, da jeg skal skrive noget fejlinfo til eventlog hvor jeg gerne vil skrive det.

Måske kan det ikke findes efter compile, men man kan jo godt se alle mulige andre ting, f.eks. metode navne og linjenumre vha stacktrace (kommer selvfølgelig an på hvilken options man har på compile), så jeg synes da ikke det ville være mærkelig hvis man også kunne se variabel navnet.
Avatar billede arnebalsby Nybegynder
14. juli 2010 - 17:24 #8
private void metode(Object o)
{
//Her kender man ikke variabel navnet på den string
//metode er kaldt med
}

public void run()
{
string a = "test";
string b = "test2";
metode(a);
}

Men nu ved nærmere eftertanke tænker jeg at det måske ikke kan lade sig gøre, fordi oppe i metode er varibel navnet vel o (hvis man endelig kunne finde det). Så jeg bliver nok nødt til at finde en anden løsning.
Avatar billede Syska Mester
14. juli 2010 - 18:20 #9
Ja, og addressen vil heller ikke være den samme, da string er en value type, så der bliver taget en kopi af den.

Men jeg kan ikke se hvordan de navne alligevel ville hjælpe med debug.

Jeg ville nok hellere vide hvor fejlen er sket, altså i hvad klasse, metode og relevante værdier fra objectet som måske var skyld i fejlen.

Så ender du nok også ud med det du egentlig var efter.

mvh
Avatar billede lasserasch Juniormester
14. juli 2010 - 18:57 #10
Man kunne måske godt lave noget ala det her, men det er umiddelbart også det eneste jeg kan komme på.


  public class Callparam
    {
        public string Name { get; set; }
        public object Value { get; set; }

        public Callparam ( string name, object value)
        {
            this.Name = name;
            this.Value = value;
        }

    }
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void metode(Callparam param01)
        {
            string variabelnavn = param01.Name;
            string variabelvalue = param01.Value.ToString();
        }

      public void run()
      {
          string a = "test";
          metode(new Callparam("a", a));

      }

      private void button1_Click(object sender, EventArgs e)
      {
          run();
      }
    }
Avatar billede arnebalsby Nybegynder
15. juli 2010 - 11:36 #11
Ja tak!, afart af samme løsning kom vist selv frem til.

Det kan jo selvfølgelig ikke lade sig gøre som jeg har tænkt det oprindeligt, pga OOP tanken med at den nye variabel kommer til at pege.

Men iøvrigt kan man altså godt se alt muligt andet om koden, linjenummer og metode navn, og hvilken metode der kaldte. Altså samme info som man ser når der kommer expceptions. Vha af det der stacktrace.

Tak for de mange svar!!
Avatar billede Syska Mester
15. juli 2010 - 14:00 #12
ja, det er der samme sted Exception får der information fra. Men de kender heller ikke variable navnene som sådan. De pejer jo bare på en linje og siger et instance måske er null.

mvh
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester