Toon posts:

[C#] Class krijgen vanuit aangevraagde class in een functie?

Pagina: 1
Acties:

Onderwerpen


  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
Dit is heel moeilijk uit te leggen maar ik ga me best doen om het zo duidelijk mogelijk over te brengen.

Ik heb een functie in Class 1.
Die functie schrijft een regel in de Console met van waar de Functie word aagevraagt. Daarvoor gebruik ik StackFrame. Dat werkt prima.

Ik heb een functie en een waarde in Class 2.
Die functie schrijft via die functie van Class 1 een regel. Maar in class 2 wil ik graag dat 1 waarde uit Class 2 word meegezonden. (een string).

Ik wil dit dus doen zonder enige aanpassingen in al mijn code.

Dus netzoals ik via StackFrame de Class en Functie aanvraag van waar het word verzonden.

Voorbeeld van functie in Class 1:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
        public void WriteLine(string sLine)
        {
            WriteLineInternal(ref sLine, LogType.Information, true, new StackTrace().GetFrame(1));
        }

        private void WriteLineInternal(ref string sLine, LogType pLogType, bool ignoreLogType, StackFrame STACKF)
        {
            lock (this)
            {
                DateTime Date = DateTime.Now;

                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("[" + Date.Hour.ToString() + ":" + Date.Minute.ToString() + ":" + Date.Second.ToString() + "." + Date.Millisecond.ToString() + "] [");
                Console.ForegroundColor = ConsoleColor.Yellow;
                Console.Write(STACKF.GetMethod().ReflectedType.Name + "." + STACKF.GetMethod().Name);
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.Write("] ");
                if (pLogType == LogType.Information)
                    Console.ForegroundColor = ConsoleColor.DarkCyan;
                else if (pLogType == LogType.Warning)
                    Console.ForegroundColor = ConsoleColor.DarkYellow;
                else if (pLogType == LogType.Error)
                    Console.ForegroundColor = ConsoleColor.Red;
                else if (pLogType == LogType.Debug)
                    Console.ForegroundColor = ConsoleColor.DarkGray;
                else
                    Console.ForegroundColor = ConsoleColor.Gray;

                Console.WriteLine(sLine);
                Console.ForegroundColor = ConsoleColor.Gray;
            }
        }


Voorbeeld Class 2:
C#:
1
2
3
4
5
6
7
public Class1 Log = new Class1();
public string Name = "Jan";

public void Test()
{
Log.WriteLine("Test bericht.");
}


Dit is een voorbeeld van het resultaat:
[00:00:00.000] [Class2.Test] [Jan] Test bericht.

Hopelijk begrijpen jullie nu wat ik bedoel.

Kan iemand mij uitleggen hoe ik dit het best kan doen?

  • RobIII
  • Registratie: december 2001
  • Laatst online: 00:35

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

Laten we eens beginnen met de vraag: why? Ik probeer even een beeld te vormen van wat je nu (concreet) aan 't doen bent en wil bereiken. En wat werkt er dan niet? Oh, ik zie dat je op "magische wijze" de string "Jan" in de writeline wil hebben?

Ik vind 't allemaal maar vaag... waarom druk je zo ingewikkeld de tijd af, en waarom gebruik je niet (bijv) een interface en pass je niet een object (of de class zichzelf met een "this") dat voldoet aan die interface door ofzo?

[Voor 124% gewijzigd door RobIII op 17-10-2010 17:15]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • CoolGamer
  • Registratie: mei 2005
  • Laatst online: 27-09 14:09

CoolGamer

What is it? Dragons?

Uit een StackTrace is niet op te maken welke instantie van het object de aanroep heeft gedaan, dus met een niet statisch veld gaat het niet lukken. Je zou het dan wel static kunnen maken en dan via reflectie opvragen, maar dat is erg onhandig.

Is het niet makkelijker om het op deze manier te doen:
C#:
1
Class1 Log = new Class1("Jan");

Moet je natuurlijk wel nog even Class1 aanpassen om die variabele bij te houden.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


  • RobIII
  • Registratie: december 2001
  • Laatst online: 00:35

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

TheCoolGamer schreef op zondag 17 oktober 2010 @ 17:22:
Is het niet makkelijker om het op deze manier te doen:
C#:
1
Class1 Log = new Class1("Jan");

Moet je natuurlijk wel nog even Class1 aanpassen om die variabele bij te houden.
Dat is ook een mooie oplossing, alleen zou ik dan gewoon "this" passen i.p.v. "Jan".

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij


  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
uit StackTrace is wel op te maken uit welke instantie de aanroep komt. Ik ik zou graag dit op zo'n magische wijzen laten verschijnen omdat het me heel veel tijd bespaard.

Edit: Srry, Linkjes gemist.

[Voor 16% gewijzigd door PrePay op 17-10-2010 17:29]


90710

Het kan zelfs nog makkelijker.

C#:
1
Class1 Log = new Class1() { Name = this.Name };


En dan gewoon een "Name" property aan de Class1-klasse hangen.

  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
Het Probleem is dat die Log eigenlijk niet eens in die Class 2 staat. Die staat weer een een andere class namelijk mijn 'Core.' Dus eigenlijk doe ik: 'Core.Log.WriteLine('Test regel')';

  • Haan
  • Registratie: februari 2004
  • Laatst online: 20:04

Haan

dotnetter

Het lijkt alsof je bezig bent je eigen logging te bouwen. Voor je het wiel opnieuw uit gaat vinden, is het misschien de moeite waard om te kijken naar bestaande frameworks zoals bijv. log4net

Kater? Eerst water, de rest komt later
Last.fm profiel


  • CoolGamer
  • Registratie: mei 2005
  • Laatst online: 27-09 14:09

CoolGamer

What is it? Dragons?

PrePay schreef op zondag 17 oktober 2010 @ 17:26:
uit StackTrace is wel op te maken uit welke instantie de aanroep komt.
Slechts het type van de klasse die de aanroep doet, niet de specifieke instantie.

Als je het Name-field veranderd in:
C#:
1
public static const string Name = "Jan";
const is slechts aanbevolen

zou je dit kunnen doen:

C#:
1
String name = (string) STACKF.GetType().GetField("Name").GetValue(null);

Zoiets, niet gecheckt.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸


  • PrePay
  • Registratie: januari 2009
  • Laatst online: 22-01 02:10
@TheCoolGamer:
Dit werkt anders prima STACKF.GetMethod().ReflectedType.Name + "." + STACKF.GetMethod().Name;

Bedankt voor die 2 de regel. Ik ga effe proberen of ik zoiets werkend krijg.

  • CoolGamer
  • Registratie: mei 2005
  • Laatst online: 27-09 14:09

CoolGamer

What is it? Dragons?

PrePay schreef op zondag 17 oktober 2010 @ 17:45:
@TheCoolGamer:
Dit werkt anders prima STACKF.GetMethod().ReflectedType.Name + "." + STACKF.GetMethod().Name;
GetMethod geeft een MethodInfo voor het Type, niet voor de specifieke instantie. GetMethod is niet gebonden aan de instantie van het object. Misschien is het handig om je in te lezen in Object Georiënteerd programmeren zodat je het verschil weet tussen een class en een instantie van een class.

¸.·´¯`·.¸.·´¯`·.¸><(((º>¸.·´¯`·.¸><(((º>¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸<º)))><¸.·´¯`·.¸.·´¯`·.¸.·´¯`·.¸

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee