2016-03-30 7 views
0

In C# habe ich ein String-Array, das ich voll mit "Getter" Methodenaufrufe geschrieben habe. Sie rufen Methoden in einer anderen Klasse auf, sodass das Array mit den erforderlichen Strings gefüllt wird. Es sieht ungefähr so ​​aus:Wie aktualisiere ich ein Array voller zurückgegebener Werte von Methodenaufrufen?

string[] mCalls = {c.get1(), c.get2(), c.get3()}; 

Ich bin mir sicher, dass diese Situation für jedes Programm gelten könnte. In meinem Programm werden jedoch die Variablen, die diese Methoden zurückgeben, anfänglich mit der Zeichenkette "Unchecked" gesetzt - und füllen dieses Beispielarray dreimal mit Unchecked. Wenn mein Programm weiterläuft und die Dinge überprüft werden, werden die Werte der String-Variablen innerhalb der Klasse geändert, in der sie sich befinden. Ich habe die Getter-Methoden zu geeigneten Zeiten einfach erneut aufgerufen, um das in meinem Array zu ändern:

mCalls[0] = c.get1(); 
mCalls[1] = c.get2(); 
mCalls[2] = c.get3(); 

Ich mag das nicht wirklich. Es scheint unvermeidlich, dass ich eines Tages etwas ändern muss, und wenn das passiert, muss ich manuell die langwierige Arbeit machen, die gesamte Indexierung in meinem Programm zu ändern. Wenn das der beste Weg ist, geht es mir gut, aber ich nehme an, es gibt bessere Wege. Also, in jedem Fall, gibt es einen Weg, um die Werte in einem Array, das so eingerichtet ist "zu aktualisieren"? Und wenn ja, was ist das?

+0

Sie mCalls eine Eigenschaft machen kann und der Getter gibt ein Array, das das Ergebnis der ist Methodenaufrufe. Auf diese Weise müssen Sie den Getter nur aktualisieren, wenn sich etwas ändert. –

+0

Sie könnten eine übergeordnete Methode erstellen, die 'mCalls' als Eingabe (oder eine Ref) verwendet und dann jede andere Methode darin ausführt. Dies ist technisch das Gleiche wie das, was Sie gerade tun, erfordert aber weniger wiederholten Code, so dass 'mCalls [0] = c.get1(); mCalls [1] = c.get2(); mCalls [2] = c.get3(); ' kann ersetzt werden mit ' GetMCalls (ref mCalls); '(GetMCalls in einem Beispielmethodennamen) –

+1

Sie haben kein Array mit Methodenaufrufen. Sie haben ein Array mit Strings, in denen die Strings von einem Methodenaufruf stammen. Der Methodenaufruf existiert in Ihrem Array nicht. – CathalMF

Antwort

2

Sie wollen etwas wie folgt aus:

public string[] MCalls 
{ 
    get 
    { 
     return new string[]{c.get1(), c.get2(), c.get3()}; 
    } 
    private set; 
} 

und dann MCalls verwenden, als ob es sich um eine reguläre Variable ist, wenn Sie die Arrays zugreifen möchten

+0

In meinem Code konnte ich das nicht in meinem 'Main' machen, also habe ich es in die Klasse mit allen Variablen eingefügt, es privat gemacht und die' c.getx() 'durch die Variablennamen selbst ersetzt. Ich habe eine string [] -Methode wie 'getMCalls()' erstellt, die das Array zurückgibt. Ich musste 'private Reihe herausnehmen;'. Wie auch immer, danke für die Hilfe @Gordon, ich habe vergessen, dass ich das tun könnte! – Alamb

0

paar Optionen:

eine Reihe von Lambda-Ausdrücke erstellen:

var mCalls = new Func<object, string>[] { 
    (object o) => o.ToString() , 
    (object o) => o.GetHashCode().ToString(), 
    (object o) => o.GetType().ToString(), 
}; 

Wenn der Eingang zu jedem Lambda das gleiche ist, können Sie ein Lambda erstellen, die ein Array zurückzugibt:

Func<object, string[]> GetValues = (object o) => new string[] 
{ 
    o.ToString() , 
    o.GetHashCode().ToString(), 
    o.GetType().ToString(), 
}; 

Dann nachladen nur das Array durch die Lambda-Aufruf:

mCalls = GetValues(c); 

Beachten Sie, dass es technisch keine Aktualisierung ist das Array, es erstellt ein neue Array. Wenn Sie das Array beibehalten müssen, aktualisieren Sie einfach die Werte, die Sie durch das Array durchlaufen möchten, und weisen Sie die Werte nach Index zu.

1

könnten Sie Ihre Array ändern, um Funktionen anstelle von Strings wie folgt zu enthalten:

Func<string>[] mCalls = { c.get1, c.get2, c.get3...}; 

Und es dann auf diese Weise verwenden:

string c2 = mCalls[1](); 

Aber beachten Sie, dass diese Art und Weise jeder Zugang a Methodenaufruf. Ich bin mir nicht sicher, was Sie wirklich erreichen wollen, es könnte bessere Gesamtentwürfe geben als dieser Ansatz.

0

Was tun Sie könnte, ist Schleife Thorugh mit Reflexion und erhalten Alle Methoden aus der Klasse und von hier aus können Sie eine Liste von Methodennamen erhalten. Mit dieser Liste können Sie einem Array zuweisen oder die Methoden nach Name oder was auch immer ausführen.Sie können auch die Liste filtern, spezifische Methodennamen nur zu erhalten:

var methodNames = typeof(MyClass).GetMethods(BindingFlags.Public | BindingFlags.Static) 
          .Select(x => x.Name) 
          .Distinct() 
          .OrderBy(x => x); 

die Methoden nennen:

foreach(var method in methodNames) 
{ 
    typeof(MyClass).GetMethod(method).Invoke(t, new[] { "world" }); 
} 
Verwandte Themen