Laden...

Zugriff auf Variable einer aufrufenden Funktion via Reflection möglich?

Erstellt von mcsfan vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.495 Views
M
mcsfan Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren
Zugriff auf Variable einer aufrufenden Funktion via Reflection möglich?

Hi, ich denke das gehört nicht unbedingt zu den Grundlagen, aber wusste nicht wohin sonst.

Ich möchte eine Variable haben, die nicht als Parameter übergeben wurde. Hier ein Beispiel:


public void FunktionName(){
          int a = 42;
          a = FunktionDieAEditiert(a); 
          FunktionDieIchEditierenKann();
          //viel code hier
}
public int FunktionDieAEditiert(int a){
           //... code hier
          return a;
}


public void FunktionDieIchEditierenKann(){
          //hier moechte ich die Variable a nutzen, jedoch kann ich die oberen Funktionen nicht 
          //veraendern, nur den Inhalt dieser. Ich brauch nur Lesezugriff ändern muss ich sie nicht
         Console.WriteLine(a);

}


Mit new StackFrame(1, true).GetMethod().Name bekomme ich zumindest den Namen der Funktion. Mit Assembly ... GetMethod( .., BindingFlags) kann man wohl auch Zugriff auf die Funktion selbst bekommen.
Kommt man auch irgendwie an die Variable ran?

Edit: FunktionDieIchEditierenKann ist in FunktionName drin. hatte vergessen beide umzubenennen

1.040 Beiträge seit 2007
vor 5 Jahren

Sag uns mal bitte, was du vorhast.

M
mcsfan Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

Oh, ich habe vergessen "Funktion" auch noch umzubenennen. FunktionDieIchEditierenKann und Funktion sind die gleichen.

In einer API wurde vergessen eine Variable an eine virtuelle Unterfunktion zu übergeben bzw. öffentlich zu machen. In den meisten Fällen benötigt man sie auch nicht. Sie ist kurz gesagt eine an verschiedenen Bedinungungen geknüpfte Zufallsvariable. Mit Kenntnis dieser kann man jedoch den weiteren Erfolg der Berechnung abschätzen. Bei geringen könnte man die Berechnung an dieser Stelle abbrechen und mit neuen Parametern starten.
Dazu muss ich jedoch wissen, welchen Wert sie hat. Einfach neu berechnen geht nicht, weil man dann quasi alles was in der API schon gemacht wurde noch einmal wiederholen müsste.

Nochmal etwas genauer.


bool istGut;
public void FunktionName(){
          int a = 42;
          istGut = true;
          a = FunktionDieAEditiert(a);
          FunktionDieIchEditierenKann(); //<--- hier kann ich etwas ändern 
          if(istGut) Funktion2();
          if(istGut) Funktion3();
          if(istGut) Funktion4();
          if(istGut) Funktion5();
          if(istGut) Funktion6();
          if(istGut) Funktion7();
          if(istGut) Funktion8();
          if(istGut) Funktion9();
          if(istGut) Funktion10();
          if(istGut) Funktion11();
          if(istGut) Funktion12(a); //man kann oben schon sagen ob hier etwas sinnvolles raus kommt und somit die ganzen Funktionen dazwischen sparen falls nicht.
          if(istGut) .....
          .....
}
public int FunktionDieAEditiert(int a){
           //... code hier
          return a;
}


public override void FunktionDieIchEditierenKann(){
          //hier moechte ich die Variable a nutzen, jedoch kann ich die oberen Funktionen nicht 
          //veraendern, nur den Inhalt dieser. Ich brauch nur Lesezugriff ändern muss ich sie nicht
         if(a<42) istGut = false; // istGut kann ich ändern

}

1.040 Beiträge seit 2007
vor 5 Jahren

Ich denke nicht, dass das geht.

Was ist das denn für eine API? Eine von eurer Firma oder eine frei zugängliche?

M
mcsfan Themenstarter:in
5 Beiträge seit 2018
vor 5 Jahren

weder noch.
Ist eine von der community eines Spiels erstelle, um Modifikationen einzubinden.

Edit:
Es geht doch!
Zumindest wenn die funktion teil eines Objektes ist.
in etwa:
typeof( objekttyp).getfield(..,.).getvalue(instanz).Method.DeclaringType?.GetFields(..).Single(n => n.Name = "a").GetValue( selbemethodenochmal.target)

easy peasy ... mir hat wer geholfen. Kann euch leider kein angepastes Bespiel geben 😦

1.040 Beiträge seit 2007
vor 5 Jahren

Wo findet man die API?

309 Beiträge seit 2008
vor 5 Jahren

Nein, das geht definitiv nicht.
Max. an die Metatdaten (Name und auf welchem Index sie liegen) kommt man ran. Mir sind ach keine anderen Libs bekannt die das können (mit Mono.Ceici z.B. gehts auch nicht).l

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}