C# Odwoływanie się do zmiennej po zawartości zmiennej string

0

Czy jest możliwa tak sytuacja:
Mam zadeklarowane

string strNazwa = "intLiczba";
int intLiczba = 0;

w zmiennej strNazwa znajduje się nazwa innej zmiennej czyli intLiczba.
Jak znając nazwę zmiennej (zapisanej jako string), np zmienić jej wartość?
Ale bez używania switch, if, i tym podobnym

<font size="3">Zmieniłem treść wiadomości, bo pierwotnie trochę zamieszałem.
Nadal nie rozwiązałem tego problemu.
</span>

0

Zmienne - chyba się nie da.
Pola - da się przez reflections lub typy dynamiczne.

0

To, co trzeba było zrobić poprzez $$ w PHP, tutaj da się i powinno inaczej.
Napisz co chcesz osiągnąć. Bo jeżeli chcesz znaleźć kontrolkę na formie o danej nazwie to.. jest o wiele prostszy sposób.

0

Chciałbym osiągnąć co następuje:
Mam taką klasę:

 class Tekst
{
     public List<string> Items = new List<string>();
}

Tworzę 3 obiekty:

Tekst slot1 = new Tekst();
Tekst slot2 = new Tekst();
Tekst slot3 = new Tekst();

I jest sobie jakiś kod w programie, gdzie chciałbym sprawdzić warunek dla żądanego slotu:
(chciałbym, żeby ten kod działał dla każdego slotu)

if (slot[>>>tutaj_odpowiedni_nr_slotu<<<].Items.Count > 0)
{
//jakiś kod
}
0

Mam coś takiego i działa.

 
Dictionary<string, int> Slownik = new Dictionary<string, int>();
Slownik.Add("slot1", slot1.Items.Count);
Slownik.Add("slot2", slot2.Items.Count);
Slownik.Add("slot3", slot3.Items.Count);

if (Slownik["slot1"] > 0)
{
}

A teraz kolejny problem. Powiedzmy, że w klasie jest metoda z parametrami.
Jak analogicznie wywołać tę metodę?

0

A teraz kolejny problem. Powiedzmy, że w klasie jest metoda z parametrami.
Jak analogicznie wywołać tę metodę?

normalnie, po indekserze, tak samo jak porównujesz w ifie
przykladowo slownik["slot1"].Metoda()

0
dark_astray napisał(a)

normalnie, po indekserze, tak samo jak porównujesz w ifie
przykladowo slownik["slot1"].Metoda()

W ten sposób ,to on bedzie mógł sobie co najwyżej CompereTo albo ToString wywołać :-) Ja bym to zrobił ,na listach w sensie Sloty[2].metoda(); jeśli koniecznie musisz odnosić się przez nazwy to zrób słownik ale jako value podawaj obiekt, to potem bedziesz miał oczywiscie dostęp i do własciwosci i do metod ,a tak to musialbys nastepny slownik tworzyć.

0

Zamiast tworzyć obiekty slot1, slot2, slot3, itd, utworzyłem tablice obiektów, do których będę się odwoływał się po indeksie.
Na najprostsze rozwiązania najtrudniej wpaść, ale mam problem.

Tworzę obiekty:

Tekst[] slot = new Tekst[4];

Próba wywołania

slot[1].pole_klasy

kończy się komunikatem: Object reference not set to an instance of an object.

Update. Zamiast klasy użyłem struktury i działa jak powinno.

0
Lamson napisał(a)
dark_astray napisał(a)

normalnie, po indekserze, tak samo jak porównujesz w ifie
przykladowo slownik["slot1"].Metoda()

W ten sposób ,to on bedzie mógł sobie co najwyżej CompereTo albo ToString wywołać :-)

Jesteś tego pewien? Lepiej sprawdź.

(Pomijając fakt czy w typ przypadku użycie Dictionary jest słuszne czy nie.)
w Dictionary może wrzucić jakikolwiek typ i może wywoływać metody dla danych klas/struktur co by to nie było.

shifttab napisał(a)

Tworzę obiekty:

Tekst[] slot = new Tekst[4];

Próba wywołania

slot[1].pole_klasy

kończy się komunikatem: Object reference not set to an instance of an object.

Wiąże się to z tym że taka struktura danych jak tablica sama nie wypełnia się obiektami. Więc zanim się odwołasz do elementu tablicy musisz go w jakiś sposob stworzyć lub przypisać.
Natomiast struktury jako typy wartościowe będą posiadały swoje wartości domyślne.

0

dla inta można wywołać raptem 5-6 funkcji :P Oczywiscie wszystko będzie okej jeśli za TValue podamy naszą klasę w tym wypadku Tekst.

0

Oczywiscie wszystko będzie okej jeśli za TValue podamy naszą klasę w tym wypadku Tekst.

...
No a o czym ja mówię? ;)

0

Ale w pierwszym poscie o tym nie wspomniałeś :) Wiem ,że uznasz ,że się czepiam, ale ktoś mógł się po prostu nie domyśleć co miałeś na myśli.

0

Ok to ja też się poczepiam jak się bawić to się bawić ;P

A teraz kolejny problem. Powiedzmy, że w klasie jest metoda z parametrami.
Jak analogicznie wywołać tę metodę?

przykladowo slownik["slot1"].Metoda()

Autor pytał jak odwołać się do metody konkretnego elementu, logiczne że do metod dostępnych dla danej klasy/struktury ktora została podana w konstruktorze Dictionary. I to dostał, więc o co chodzi ;)

0

To juz trzeba autora spytac czego dokladnie nie wiedzial. Wydaje mi sie ze predzej jak sie dostac jednoczesnie do metod i wlasciwosci obiektu niz jak sie wywoluje metody w c# co mu pokazales :P

0

Witam.

Zazwyczaj tylko czytam posty i nie zadaję żadnych pytań. Tym razem jednak nie znalazłem nigdzie interesującej mnie odpowiedzi.

W jaki sposób stworzyć sobie w c# taki uniwersalny setter i getter jaki da się zrobić w php?

        private $dane = array();

        function __get($parametr)
	{
		if (isset($this->dane[$parametr]))
			return $this->dane[$parametr];
		return '';
	}
	
	// ustawia atrybut
	function __set($parametr, $wartosc)
	{
		$this->dane[$parametr] = $wartosc;
	}

klasa musi być możliwa do serializacji (Remoting), dlatego też odpada Dictionary.
Na obiekcie RejRekord wykonywana jest zdalna metoda klasy zdalnej i później zmodyfikowany obiekt RejRekord jest zwracany.

[Serializable]
    public class RejRekord
    {
        public string Imie1;
        public string Imie2;
        public string Nazwisko;
        public string Studia;
        public string Folder;
        public string Indeks;
        public string GrupaLab;
        public string DataRej;


        public void SetField(string FieldName, string FieldValue)
        {
            this.FieldName = FieldValue;
        }

        public string GetField(string FieldName)
        {
            return this.FieldName;
        }
    
        public RejRekord()
        {
  
        }       
    }

Mogłoby to być też zrobione na jakiejś tablicy, aby można było zapisywać zmienne, których nazwy nie zostały uwzględnione w momencie pisania klasy.


        public void SetField(string FieldName, string FieldValue)
        {
            this.tablica[FieldName] = FieldValue;
        }

        public string GetField(string FieldName)
        {
            return this.tablica[FieldName];
        }
0

tak, tylko o to chodzi w programowaniu obiektowym, zeby zdefiniowac swoje uniwersum :) czyli obiekty z ich cechami i zaleznosci miedzy nimi i po nich sie poruszac
my chcemy wiedziec co ustawiamy, a nie ustawiac cokolwiek
ale oczywiscie zostaje ci zawsze reflekcja, ktora swietnie nadaje sie do zrealizowania uniwersalnego gettera/settera ocywiscie na istniejacych polach klasy (pomijam kwestie wydajnosci)
i znowu podkresle, my nie chcemy miec jednego wielkiego worka (tablicy, zbioru) par klucz-wartosc, tylko jasno zdefiniowane cechy obiektu, an ktorych dzialamy
<ort>po prostu </ort>w programowaniu obiektowym pewne rzeczy realizuje sie za pomoca innych schematow

0

Dzięki.

Zastosowałem się do Twojej porady. Każde pole ma swój własny setter/getter, jednakże szkoda, że nie jest wskazane wykorzystywać takie uniwersalne rozwiązania.

W moim przypadku obiekt RejRekored jest tworzony z pliku xml i wypełnienie tego obiektu, zmiana, wyszukanie, wyłuskanie informacji za pomocą uniwersalnego settera/gettera zajęłoby w kodzie programu jedną linijkę : "dla każdego wierzchołka/pola wykonaj odpowiednia metodę". Po co mi oddzielne metody do każdego z pól, jeśli pola są podobnego typu i nie muszą spełniać jakichś indywidualnych wymogów. Przecież po to są zmienne i pętle, aby programowanie było prostsze i bardziej zautomatyzowane.

Przy rozdzielnych setterach w zależności od parametru wykonywana jest instrukcja switch i wywoływana odpowiednia metoda. Zajmuje to znacznie więcej miejsca, trzeba się napisać. Jednakże możliwe, że tak jak wspomniałeś, dzięki temu jest większa kontrola nad kodem. Może z czasem się do tego przekonam.

Pozdrawiam

0

@jinks, nie uzywanie magicznych getterow/setterow ma sens, bo

  1. jest to wolniejsze od zdefiniowanych pol
  2. nie sprawdza nic w czasie kompilacji, wiec "zyskujesz" jedno miejsce do bledu wiecej
  3. zawsze mozes uzyc sztuczki kompilatora i stworzyc property za pomoce:
    public String PropertyName{get;set;}
  4. tak jak powiedzial massther przecy to programowaniu obiektowemu

Aha i nie zdziwie sie jak mozesz to zrodib w .NET 4 z uzyciem DLR(bodajze tak nazywa sie silnik/framework/bilioteka/pojecia nie mam co to jest dokladnie dla dynamicznych jezykow programowania)

Pozdrawiam

0
Assassin napisał(a)
  1. zawsze mozes uzyc sztuczki kompilatora i stworzyc property za pomoce:
    public String PropertyName{get;set;}

Składnia języka jest "sztuczką kompilatora"? for i int to też sztuczki kompilatora? :|

jinks napisał(a)

W moim przypadku obiekt RejRekored jest tworzony z pliku xml i wypełnienie tego obiektu, zmiana, wyszukanie, wyłuskanie informacji za pomocą uniwersalnego settera/gettera zajęłoby w kodzie programu jedną linijkę : "dla każdego wierzchołka/pola wykonaj odpowiednia metodę". Po co mi oddzielne metody do każdego z pól, jeśli pola są podobnego typu i nie muszą spełniać jakichś indywidualnych wymogów. Przecież po to są zmienne i pętle, aby programowanie było prostsze i bardziej zautomatyzowane.

To czemu nie użyjesz serializacji XML? Załadowanie obiektu z XML to trzy linijki kodu.

0

i to jest caly problem, ze ludzie poczatkujacy od razu rzucaja sie na gleboka wode nie majac pojecia o paradygmatach programowania obiektowego, jakis ogolnych schematach, jak dzialaja pewne mechanizmy w technologiach/jezykach, ktorych chca uzywac, wzorcach projektowych
dlatego popelniaja mase bledow, sami zapedzaja sie w rog, z ktorego czesto nie potrafia wybrnac
najlepszym przykladem niewlasciwego uzywania pewnych technologi jest www, masa stron nawet nie lezala obok html i css :(
a o ile swiat (web) bylby piekniejszy gdyby wszyscy stosowali sie do ogolnie przyjetych standardow

1 użytkowników online, w tym zalogowanych: 0, gości: 1