NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Garrom Orc Shaman:23.10.2017 22:05

Zdravím. Řekněme že mám třídu Class a v té mém proměnou Var takže bych k Var přistupoval Class.Var. Jde nějak udělat že bych měl string "Class.Var" a ctěl pomoci tohoto stringu přistupovat k Var. Je to možné ?
Děkuji
-Garrom

Odpovědět
23.10.2017 22:05
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Garrom Orc Shaman
Ondřej Štorc:23.10.2017 22:22
PropertyInfo pinfo = typeof(Class).GetProperty("Var");
object value = pinfo.GetValue(InstanceClass, null);
Nahoru Odpovědět
23.10.2017 22:22
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Garrom Orc Shaman:24.10.2017 13:28

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;
Editováno 24.10.2017 13:30
Nahoru Odpovědět
24.10.2017 13:28
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Garrom Orc Shaman
Ondřej Štorc:24.10.2017 13:55

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);

víc zde: https://msdn.microsoft.com/…vs.110).aspx

Nahoru Odpovědět
24.10.2017 13:55
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Garrom Orc Shaman:24.10.2017 14:34

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.

Editováno 24.10.2017 14:36
Nahoru Odpovědět
24.10.2017 14:34
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Garrom Orc Shaman
Ondřej Štorc:24.10.2017 14:39

Zkus si tam dosadit natvrdo ty stringy, jestli není překlep v nich

Nahoru Odpovědět
24.10.2017 14:39
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Garrom Orc Shaman:24.10.2017 14:51

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

Nahoru Odpovědět
24.10.2017 14:51
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
Ondřej Štorc
Tvůrce
Avatar
Odpovídá na Garrom Orc Shaman
Ondřej Štorc:24.10.2017 20:16

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...

Nahoru Odpovědět
24.10.2017 20:16
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Odpovídá na Ondřej Štorc
Garrom Orc Shaman:24.10.2017 20:56

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.Set­Value().
Jednoduché, efektivní a kvůli nedostatku dokumentace těžké na zjištění.

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět
24.10.2017 20:56
Life for Code, Code for Life. I chose my path, I should stick on it.
Avatar
krepsy3
Tvůrce
Avatar
krepsy3:24.10.2017 23:22

Nelam si s tím hlavu :D Reflexe umí být dost zrádná :D Já na podobné kraviny narážím furt, hlavně ve wpf při návrhu třídy, ze které se budou bindovat data ;)

Nahoru Odpovědět
24.10.2017 23:22
Programátor je stroj k převodu kávy na kód.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.