2016-11-14 8 views
0

Ich versuche rekursiv den Namen einer Variablen, zum Beispiel für die Variable test.child, wenn ich folgen this topic, bekomme ich nur child und ich habe keine Ahnung, wie Sie alle Eltern bekommen.Rekursiv erhalten Variablenname

Hier mein Testcode ist:

public static class MemberInfoGetting 
{ 
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression) 
    { 
     MemberExpression expressionBody = (MemberExpression)memberExpression.Body; 
     return expressionBody.Member.Name; 
    } 
} 

public class Test 
{ 
    public string child = "childValue"; 
} 

static void Main(string[] args) 
{ 
    //string testVariable = "value"; 
    Test test = new Test(); 
    test.child = "newValue"; 
    string nameOfTestVariable = MemberInfoGetting.GetMemberName(() => test.child); 

    Console.WriteLine(nameOfTestVariable + " | " + test.child); 
    Console.Read(); 
} 
+0

Was wäre ein "Elternteil" in Ihrer Stichprobe? – gregkalapos

+0

hier 'test' ist das übergeordnete – LeCintas

+0

Ich sehe, also wollen Sie den Variablennamen + den Namen der Instanz? (und wenn das wieder in einer anderen Instanz enthalten ist der Name .. etc.) – gregkalapos

Antwort

1

ich dies als die erste Absicht werfen: (nicht zu 100% fertig, noch darüber nachzudenken, zumindest es kümmert sich um Ihre Probe)

public static class MemberInfoGetting { 
    public static string GetMemberName<T>(Expression<Func<T>> memberExpression) { 
     MemberExpression expressionBody = (MemberExpression)memberExpression.Body; 

     var str = expressionBody.ToString(); 
     var lst = str.Split('.').Skip(2).ToList(); //This needs LINQ, otherwise do it manually 

     StringBuilder retVal = new StringBuilder(); 

     for (int i = 0; i < lst.Count; i++) { 
      retVal.Append(lst[i]); 
      if(i != lst.Count -1) { 
       retVal.Append("."); 
      } 
     }    

     return retVal.ToString(); 
    } 
} 
+0

Ist es die richtige Lösung für ein Problem? Ich habe die Klassennamen nicht bekommen. Es behandelt das Beispiel, da der verwendete Instanzname dem Klassennamen entspricht und im Beispiel keine Vererbung verwendet wird. –

+0

Zunächst bin ich mir nicht sicher, ob dies für jede Eingabe korrekt ist. Was haben Sie eingegeben? (Zeigen Sie uns den Anrufer Teil ..). Btw wenn ich das Problem richtig verstehe, dann wollen wir den Klassennamen nicht! Wir wollen den Variablennamen! Übrigens. Sie können den Klassennamen über (MemberExpression) memberExpression erhalten (aber wieder, das ist nicht, was wir wollen) – gregkalapos

+0

versuchen Sie es mit Test obj = new Test(); GetMemberName (() => obj.child); –

0

dann vielleicht ist es nützlich, wie etwas zu haben:

public class Test 
{ 
    public string value = "Value"; 

    public Test child; 

    public Test(Test childObject) 
    { 
     this.child = childObject; 
    } 
} 

Sie dieses Objekt für Rekursion dann verwenden können. Wie jetzt haben Sie Objekte verschachtelt. Etwas wie folgt aus:

Test child = new Test(null); 
Test parent = new Test(child); 

Also, wenn Sie eine Methode erstellen, die das parent Objekt in diesem Fall als Parameter übernimmt, können Sie auch die parent und die child Werte erhalten. In diesem Fall ist die Exit-Bedingung Ihrer Rekursionsmethode das Objekt Test, das eine Null hat child.