Diskuze: Jak převést string na jméno proměnné ?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 10 zpráv z 10.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
PropertyInfo pinfo = typeof(Class).GetProperty("Var");
object value = pinfo.GetValue(InstanceClass, null);
Chápu tedy že mám použít něco jménem reflector... chvilku my trvalo než jsem přešel na to že mám přidat
using System.Reflection;
Kousek kódu funguje který jsi mi poslal funguje pokud chci proměnnou
získat a pracovat s ní ovšem mám problémy s mezilidskou komunikací
(součást Autismu) a vyjádřil jsem se špatně. Já instanci třídy kterou
chci dosadit jako proměnou definuji uvnitř třídy. Jinými slovy potřebuji
instanci třídy dosadit do proměnné kterou potřebuji najít dle stringu. Aby
celá věc byla ještě komplikovanější onen proměnná se nachází v
instanci třídy(třída reprezentující nastavení) která samotná je uvnitř
statické třídy(třída starající se o obecná data jako uložené hry nebo
rutime data jako munice či zdraví).
Celá reference tedy vypadá tako
DataManager.config.onenProměnnáKterouChciNajítPodleStringu;
Nejsem si jistý jestli tě chápu, ale k nastavení hodnoty můžeš použít SetValue:
PropertyInfo pinfo = typeof(Class).GetProperty("Var");
object value = pinfo.GetValue(InstanceClass, HodnotaKterouChcesNastavit);
Z nějakého důvodu mi tento řádek :
PropertyInfo pinfo = typeof(Config).GetProperty(objectName);
vždy vrátí null. Nechápu proč, jméno je správně, proměnná je
public. V čem by mohl být problém ?
Mimochodem : můžu takto získat i referenční typy nebo jen hodnotové ? Já
se totiž snažím získat instanci třídy uloženou v proměnné aneb.
referenční typ.
poznámka : typ co se snažím získat je InputButton. Třída reprezentuje
fyzické tlačítko v mém ovládacím systému.
Zkus si tam dosadit natvrdo ty stringy, jestli není překlep v nich
Také ne, je to divné. Posílám kusy kódu aby bylo snadnější zjistit co
je problém.
Tady je zjednodušená třída ve které se to snažím udělat :
public static class Input
{
public static void GetButtonVariable(string objectName)
{
Debug.Log(objectName);
PropertyInfo pinfo = typeof(Config).GetProperty(objectName);
Debug.Log(pinfo);
}
}
Tady je jak je proměnná založena :
public InputButton P1Up = new InputButton(Key.W, 128, 0);
A zde je třída InputButton :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using SharpDX;
using SharpDX.DirectInput;
public class InputButton
{
public JoystickOffset button;
public Key key;
public int pressValue;
public int relaseValue;
public bool isJoystick;
public bool isPressed = false;
public InputButton(JoystickOffset button, int pressValue, int relaseValue)
{
this.button = button;
this.pressValue = pressValue;
this.relaseValue = relaseValue;
isJoystick = true;
}
public InputButton(Key key, int pressValue, int relaseValue)
{
this.key = key;
this.pressValue = pressValue;
this.relaseValue = relaseValue;
isJoystick = false;
}
public InputButton()
{
//Parametr-less constructor for serialization
}
}
Poznámka : Já vím že direct input není oficiálně doporučován ale mně se líbí pro jeho schopnost poradit si se zařízeními všeho druhu
Tak po chvíli googlení:
public void SetProperty(string compoundProperty, object target, object value)
{
string[] bits = compoundProperty.Split('.');
for (int i = 0; i < bits.Length - 1; i++)
{
PropertyInfo propertyToGet = target.GetType().GetProperty(bits[i]);
target = propertyToGet.GetValue(target, null);
}
PropertyInfo propertyToSet = target.GetType().GetProperty(bits.Last());
propertyToSet.SetValue(target, value, null);
}
Zjevně ta metoda nedokáže pracovat s nested propertama, proto si to musíš rozdělit po tečkách a skrz to se dostat k tomu objektu, který tě zajímá. Kdyby si náhodou chtěl získávat tu hodnotu, tak tam akorát místo SetProperty dej GetProperty...
Opět si připadám jako idiot. Proč hledám property ? Onen proměnné nemají setry/getry a ani nemůžou jelikož někde používám ref keyword. Je pochopitelné že dostanu null když se snažím najít field metodou na hledání property. Tvé řešení sice nebylo úplně správné ale navedlo mně na správnou cestu. Kdyby někdo procházel kolem a měl stejný problém vysvětlím řešení.
Metoda GetProperty() hledá a vrací pouze proměnné které jsou property, to jsou ty které mají metody Get() a Set()(příklad níže)
public int myAwesomeProperty {set;get}
Jenže bez metody set nebo get to není property ale field.
Field můžeme získat jako FieldInfo a to metodou GetField.
Následně můžeme přiřadit hodnotu (instanci třídy) pomocí
fieldInfo.SetValue().
Jednoduché, efektivní a kvůli nedostatku dokumentace těžké na
zjištění.
Zobrazeno 10 zpráv z 10.