2017-06-01 2 views
0

Ich bin in einem Reflexionsproblem kämpfen, eigentlich bin ich mir nicht sicher, ob es ein Reflexionsproblem ist, aber die Situation ist unten gezeigt.Wie verwenden Sie die Funktionen einer Variablen, indem Sie den gleichen String-Namen anstelle des Variablennamens verwenden?

In Bildklasse haben wir "sprite" propety, die wir nennen können. Ist es möglich, etwas wie "temp.sprite" anstatt "IMG1.sprite" zu verwenden?

public Sprite newSprite; 
IMG1.sprite = newSprite; 

Änderung

temp.sprite = newSprite; 

Vielen Dank.

+1

Anstatt eine Zeichenfolge (für Temp) zu verwenden, müssten Sie eine 'MyClass' (für Temp) erstellen, die eine 'Sprite'-Eigenschaft enthält. Sie können dann 'MyClass.ToString()' überschreiben, um die Zeichenfolge so zu komponieren, wie sie zusammengesetzt werden soll. Dies ist jedoch ein relativ umständlicher Ansatz; welches für Ihren Fall völlig übertrieben sein kann. Wenn Sie etwas angeben, was Sie insgesamt erreichen möchten; Wir können Ihnen eine genauere Antwort geben, die Overkill vermeidet. – Flater

+0

'Temp' ist eine Zeichenkette und hat nicht die 'Sprite'-Eigenschaft, also ** No **. Ich denke du solltest erklären warum und was genau du machst. Dies wird so vielen Menschen helfen, Ihre Frage zu beantworten. – Programmer

Antwort

1

Ich bin mir nicht sicher, ob Sie Reflexion in Ihrem Fall verwenden müssen. Aber ich würde vorschlagen, mit dem Wörterbuch zu gehen. Also am Anfang müssen Sie alle von Ihnen Bildfelder hinzufügen, um Wörterbuch:

Dictionary<string, Image> dict = new Dictionary<string, Image>(); 
dict.Add(nameof(IMG1), IMG1); 

dann können Sie Ihr Feld zugreifen:

dict[temp].sprite = xxxx 

Dieser Ansatz ist viel besser, wenn es um Leistung geht. Aber wenn Sie es wirklich durch Reflexion tun müssen, können Sie in "dynamisches" Schlüsselwort schauen, das die Verwendung der Reflexion vereinfacht, wenn Sie nicht damit vertraut sind.

oder durch regelmäßige Reflexion mit Sie können so etwas wie dies versuchen:

FieldInfo fieldInfo = typeof(YourClassWithImageField).GetField(temp); 
Image img = fieldInfo.GetValue(ObjectWithYourField) as Image; 
if (img != null) 
{ 
    img.sprite = xxxx; 
} 

Hoffe, es hilft.

Verwandte Themen