Diskuze: Univerzálna metóda
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tvůrce
Zobrazeno 19 zpráv z 19.
//= 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.
Volanie metódy by mylo byť:
skladnik.Nacitaj(skladnik.Osoby, "osoby.xml");
skladnik.Nacitaj(skladnik.DhmZaznamy, "dhm.xml");
skladnik.Nacitaj(skladnik.KhmZaznamy, "khm.xml");
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.
Můžeš zkusit tomu dát parametr ObservableCollection<T> param, čímž vlastně řekneš, že parametr je jakákoliv pozorovatelná kolekce.
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();
}
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.
Musí tam byť tá návratová hodnota? Nešlo by to spraviť void?
Naco? Momentálně vytvaris 2x instanci. Proste v ctoru nacti 3 kolekce a mas.
Jane, nech sa snažím, ako sa snažím, neviem ako použiť tvoju dynamickú metódu.
Jedná se o šablonovou metodu, kdyžtak si o tom něco nastuduj.
Osoby = Nacitaj<ObservableCollection<Osoba>>("osoby.xml");
Jan Vargovský (pako), patrik.valkovic ďakujem veľmi pekne. Vyzerá to tak, že to je presne to, čo potrebujem.
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.
Nejsem teda patrik, ale snad můžu odpovědět
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í.
Díky Jane, nevedel som stanoviť parameter DhmZaznamy, T instance sa mi páči.
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));
}
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.
V C++ jsou templaty, tak proto. Ale pozor, není to úplně to samé. V C# je to taková odnož.
Zobrazeno 19 zpráv z 19.