Válí se ti projekty v šuplíku? Dostaň je mezi lidi a získej cool tričko a body na profi IT kurzy v soutěži ITnetwork summer 2017!
Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)
Avatar
Libor Šimo (libcosenior):4.9.2015 15:17

Mám takýto kód:

public class Skladnik: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    public ObservableCollection<Osoba> Osoby { get; set; }
    public ObservableCollection<DhmZaznam> DhmZaznamy { get; set; }
    public ObservableCollection<KhmZaznam> KhmZaznamy { get; set; }

    public Skladnik()
    {
        Osoby = new ObservableCollection<Osoba>();
        DhmZaznamy = new ObservableCollection<DhmZaznam>();
        KhmZaznamy = new ObservableCollection<KhmZaznam>();
    }

    public void Nacitaj(string Subor)
    {
        XmlSerializer serializer = new XmlSerializer(Osoby.GetType());
        if (File.Exists(Subor))
        {
            using (StreamReader sr = new StreamReader(Subor))
            {
                Osoby = (ObservableCollection<Osoba>)serializer.Deserialize(sr);
            }
        }
        else
            Osoby = new ObservableCollection<Osoba>();
    }

a chcel by som, aby metóda Nacitaj() bola univerzálna, teda aby pracovala so všetkými kolekciami.
Neviem, čo mám dať ako vstupný atribút, aby to pracovalo. Nejakým spôsobom tam treba dať ObservableCollec­tion<> YX, ale ako docieliť, aby mohla byť rôzna. Teda raz Osoba, DhmZaznam alebo KhmZaznam, podľa zadania pri volaní metódy.
Som neskúsený v c#, tak vás prosím o radu.

Nepáčilo by sa mi pre každú kolekciu písať tie isté metódy zvlášť.

Editováno 4.9.2015 15:19
Odpovědět 4.9.2015 15:17
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):4.9.2015 15:42

Volanie metódy by mylo byť:

skladnik.Nacitaj(skladnik.Osoby, "osoby.xml");
skladnik.Nacitaj(skladnik.DhmZaznamy, "dhm.xml");
skladnik.Nacitaj(skladnik.KhmZaznamy, "khm.xml");
Editováno 4.9.2015 15:42
Nahoru Odpovědět 4.9.2015 15:42
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Libor Šimo (libcosenior):4.9.2015 15:48

Skúšal som použiť var (dátový typ až pri preklade programu), ale nefungovalo mi to. Nedal sa použiť ako vstupný parameter metódy.

Nahoru Odpovědět 4.9.2015 15:48
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Petr Štechmüller:4.9.2015 16:08

Můžeš zkusit tomu dát parametr ObservableCollec­tion<T> param, čímž vlastně řekneš, že parametr je jakákoliv pozorovatelná kolekce.

Nahoru Odpovědět 4.9.2015 16:08
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:4.9.2015 16:09

1. var už znáš za doby kompilace. Zkus si napsat jen "var a;" a ani to nezkompiluješ. On si za kompilace najde typ podle pravé strany. Jestli chceš opravdu run-time variable, která může nést vše, použij dynamic.

2.

public T Nacitaj<T>(string Subor)
where T: new()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));
        if (File.Exists(Subor))
        {
            using (StreamReader sr = new StreamReader(Subor))
            {
                return (T)serializer.Deserialize(sr);
            }
        }
        else
            return new T();
    }
Editováno 4.9.2015 16:10
 
Nahoru Odpovědět  +3 4.9.2015 16:09
Avatar
Luboš Běhounek (Satik):4.9.2015 16:09

Chápeš špatně význam slova var (resp. jeho použití).
Var v C# neznamená, že tam můžeš strčit cokoliv, ale že si program sám domyslí z pravé strany, co za typ to je.

Třeba

var osoba = new Osoba("Karel");

je to samé, jako když by jsi napsal

Osoba osoba = new Osoba("Karel");

-> do proměnné osoba už nemůžeš uložit nic jiného než instanci třídy Osoba nebo jeho potomků.

Použití var je omezené, nemůžeš ho použít třeba pro parametry metody, protože tam překladač nepozná, jakého typu by ten parametr měl být.

Nahoru Odpovědět  +3 4.9.2015 16:09
:)
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):4.9.2015 16:24

Musí tam byť tá návratová hodnota? Nešlo by to spraviť void?

Akceptované řešení
+5 Zkušeností
Řešení problému
Nahoru Odpovědět 4.9.2015 16:24
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:4.9.2015 16:26

Naco? Momentálně vytvaris 2x instanci. Proste v ctoru nacti 3 kolekce a mas.

 
Nahoru Odpovědět  +1 4.9.2015 16:26
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):5.9.2015 8:02

Jane, nech sa snažím, ako sa snažím, neviem ako použiť tvoju dynamickú metódu.

Nahoru Odpovědět 5.9.2015 8:02
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):5.9.2015 8:55

Presnejšie, neviem ako ju zavolať.

Nahoru Odpovědět 5.9.2015 8:55
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
patrik.valkovic:5.9.2015 9:37

Jedná se o šablonovou metodu, kdyžtak si o tom něco nastuduj.

Osoby = Nacitaj<ObservableCollection<Osoba>>("osoby.xml");
Nahoru Odpovědět  +2 5.9.2015 9:37
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na patrik.valkovic
Libor Šimo (libcosenior):5.9.2015 11:13

Jan Vargovský (pako), patrik.valkovic ďakujem veľmi pekne. Vyzerá to tak, že to je presne to, čo potrebujem.

Nahoru Odpovědět  +1 5.9.2015 11:13
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na patrik.valkovic
Libor Šimo (libcosenior):5.9.2015 11:20

Patrik, ako by si upravil na šablónu túto metódu?

public void UlozDhm(string subor)
{
    XmlSerializer serializer = new XmlSerializer(DhmZaznamy.GetType());
    using (StreamWriter sw = new StreamWriter(subor))
    {
        serializer.Serialize(sw, DhmZaznamy);
    }
}

Skúšam to, ale nedarí sa mi, ešte som úplne nepochopil princíp.

Editováno 5.9.2015 11:22
Nahoru Odpovědět 5.9.2015 11:20
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Jan Vargovský:5.9.2015 12:21

Nejsem teda patrik, ale snad můžu odpovědět :D

public void Uloz<T>(T instance, string subor)
{
    XmlSerializer serializer = new XmlSerializer(instance.GetType());
    using (StreamWriter sw = new StreamWriter(subor))
    {
        serializer.Serialize(sw, instance);
    }
}

Zavoláš to jako:

Uloz(DhmZaznamy, "blabla.xml");

Už tam nemusíš explicitně psát do špičatých závorek typ, protože tam ten typ předáváš v parametru, takže on si ho zjistí.

 
Nahoru Odpovědět  +1 5.9.2015 12:21
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):5.9.2015 12:25

Díky Jane, nevedel som stanoviť parameter DhmZaznamy, T instance sa mi páči. ;-)

Nahoru Odpovědět 5.9.2015 12:25
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Jan Vargovský
Libor Šimo (libcosenior):5.9.2015 13:11

Asi som úplne blbý. Nie som schopný vyriešiť túto metódu šablónou.

public void ZoradDhm()
{
    DhmZaznamy = new ObservableCollection<DhmZaznam>(DhmZaznamy.OrderBy(a => a.Vcm));
}
Nahoru Odpovědět 5.9.2015 13:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
patrik.valkovic:5.9.2015 13:33

Však nikde proměnnou DhmZaznamy nepředáváš. Pokud ta metoda nemá přístup k proměnné, nemůžeš s ní logicky pracovat.
Pokud chceš se šablonami pracovat, tak si o nich něco nastuduj, ale nečekej, že tu budeme řešit každý tvůj problém.

Nahoru Odpovědět 5.9.2015 13:33
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Daniel Kosík (Ghost4Man):5.9.2015 13:41

Šablony? Od kdy se genericitě/generice říká šablony?

Nahoru Odpovědět 5.9.2015 13:41
Všechno na světě můžete chtít. Jenom nemůžete chtít, aby se vám chtělo.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na Daniel Kosík (Ghost4Man)
Jan Vargovský:5.9.2015 13:54

V C++ jsou templaty, tak proto. Ale pozor, není to úplně to samé. V C# je to taková odnož.

 
Nahoru Odpovědět 5.9.2015 13:54
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 19 zpráv z 19.