2017-02-01 3 views
1

Hier ist meine Klasse:C# Wie benutze ich myclass.object1.child als Ganzes ein Argument?

class InfoClass 
{ 
    public string source; 
    public InfoItem tests { get; set; } 
    public InfoItem serverBuild { get; set; } 
    public InfoItem localBuild { get; set; } 
    public InfoItem installedBuild { get; set; } 

    public void pull() 
    { 
     InfoClass newInfo = JsonConvert.DeserializeObject<InfoClass>(File.ReadAllText(this.source)); 
     this.tests = newInfo.tests; 
     this.serverBuild = newInfo.serverBuild; 
     this.localBuild = newInfo.localBuild; 
     this.installedBuild = newInfo.installedBuild; 
    } 
    public void push() 
    { 
     File.WriteAllText(this.source, JsonConvert.SerializeObject(this)); 
    } 
} 

public class InfoItem 
{ 
    public string version { get; set; } 
    public string status { get; set; } 
    public string updated { get; set; } 
} 

Nun, ich Instanz dieser Klasse in einer anderen Datei zu erstellen, zB:

InfoClass info = new InfoClass() 

Und dann benutze ich Pull- und Push auf einige Werte zu aktualisieren:

 info.pull(); 
     info.serverBuild.status = "checking"; 
     info.push(); 

Was ich will, ist eine Hilfsmethode zu erstellen, um es häufiger und esier zu verwenden. Etwas wie folgt aus:

info.Update(serverBuild.status, "checking"); //instead of above 3 lines 
+0

Warum diese Methode in Ihrem InfoClass nicht enthalten ?? – taquion

+2

Was ist Ihre Frage? –

+0

Dies wäre nur eine neue Funktion in der 'InfoClass'-Klasse namens' Update', die die drei oben genannten Zeilen aufruft. Im Grunde nur eine Wrapper-Funktion. – gmiley

Antwort

1

Schreiben Sie eine Erweiterung:

public static class Extensions 
{ 
    public static void Update<T>(this T info, Action<T> action) where T : InfoClass 
    { 
     info.pull(); 
     action(info); 
     info.push(); 
    } 
} 

Dann ist es wie folgt verwenden:

info.Update(x=>{x.serverBuild.status = "test";}); 
+0

Kleiner Hinweis für Ihre Lösung: 'Aktion ' erfordert einen Parameter vom Typ 'T' und in Ihrem Code haben Sie' action(); 'anstelle von' action (info); ' –

+0

Wo sollte ich öffentliche statische Erweiterungen setzen ?? –

+0

Im Dateinamen MyExtensions.cs – eocron

0

Sie Methode erstellen können in Ihrem InfoClass sagen wir mal:

public void Update(string name, object value) 
{ 
    pull(); // pull from here 
    // split name into "path like" 
    string[] path = name.Split('.', StringSplitOptions.RemoveEmptyEntries); 
    // set current path reference 
    object current = this; 
    for(int i = 0; i < path.Length - 1; i++) 
    { 
     string way = path[i]; 
     // reassign reference till the pre-last element 
     current = current.GetType().GetProperty(way, BindingFlags.Instance | BindingFlags.Public).GetValue(current); 
    } 
    // set the new value 
    current.GetType().GetProperty(path[path.Length - 1], BindingFlags.Instance | BindingFlags.Public).SetValue(current, value); 
    push(); // push from here 
} 

Und dann können Sie es fast wie Sie, sondern info.Update(serverBuild.status, "checking"); wollte musst du info.Update("serverBuild.status", "checking");

Check this online

Verwandte Themen