Avatar
Libor Šimo (libcosenior):

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

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

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:

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ý:

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

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

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ý:

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

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

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:

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

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

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ý:

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

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

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:

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

Š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ý:

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.