IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: Generická metoda, pro různé kontejnery se stejnou vlastností

Aktivity
Avatar
jan.pichl
Člen
Avatar
jan.pichl:31.10.2016 20:49

Ahoj

udělal jsem si různé kontejnery na data, splečné mají všechny propertu ID

 //public class MainMenuButtons_ContainerX : INotifyPropertyChanged
 //public class MainMenuButtons_ContainerY: INotifyPropertyChanged

public class MainMenuButtons_Container : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string info)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
        }

        private Int64 _ID;
        public Int64 ID
        {
            get { return _ID; }
            set { _ID = value; NotifyPropertyChanged("ID"); }
        }

tyhle kontejnery strkám do různých kolekcí

// public TrulyObservableCollection<MainMenuButtons_ContainerX> Data { get; set; }
// public TrulyObservableCollection<MainMenuButtons_ContainerY> Data { get; set; }

public TrulyObservableCollection<MainMenuButtons_Container> Data { get; set; }

Když dojde k přesunu uvnitř kolekce

case NotifyCollectionChangedAction.Move:
                        // MainMenuButtons_MainX.MoveElement(send, e.OldStartingIndex,
                        // MainMenuButtons_MainY.MoveElement(send, e.OldStartingIndex,
                     MainMenuButtons_Main.MoveElement(send, e.OldStartingIndex, e.NewStartingIndex);
                    break;

tak ji přerovnám podle ID touto metodou

//   private static void MoveElementX(TrulyObservableCollection<MainMenuButtons_ContainerX> coll, int oldPos, int newPos)
//   private static void MoveElementY(TrulyObservableCollection<MainMenuButtons_ContainerY> coll, int oldPos, int newPos)

   private static void MoveElement(TrulyObservableCollection<MainMenuButtons_Container> coll, int oldPos, int newPos)
        {
            var dt=MainMenuButtons_Main.GetInstance().DataColetion;

            Int64 s = coll[oldPos].ID;

            coll.SuppressNotification = true;

            coll[oldPos].ID = coll[newPos].ID;
            coll[newPos].ID = s;

            coll.SuppressNotification = false;
        }

a protože těch kontejnerů je povícero, obsahují různá data krom té property ID, podle které to řadím tak jsem usoudil že by se na to hodila generická metoda. Tady ale narážím na problém implementace. Zatím se zabývám tím že pro ty kontejnery udělám rozhraní

interface IDataContejner
   {
       Int64 ID { get; set; }
   }

Ale stále nemohu přijít na to jak to prakticky využít. Předem děkuji za rady.

 
Odpovědět
31.10.2016 20:49
Avatar
Marian Benčat:31.10.2016 21:12

Konkrétní typ:

public TrulyObservableCollection<MainMenuButtons_Container> Data { get; set; }

Na všech místech (na to už přijdeš) nahraď za generický parametr T a ten omez constrainem:

https://dotnetfiddle.net/EY2OLm

Nejdulezitejsi je pochopit samotnou podstatu interfacu.. je to jakysi predpis.. interfacem povis "todle musi splnovat". Tedy u generiky a contraintu (constrainu? tyto slova si nikdy nezapamatuju) rikas "hele.. jako vole, nevim co ti tam prijde, ale bude to mit IDčko).

Editováno 31.10.2016 21:15
Nahoru Odpovědět
31.10.2016 21:12
Totalitní admini..
Avatar
jan.pichl
Člen
Avatar
jan.pichl:31.10.2016 21:52

Ok, do kontejnerů jsem přidal interface. Tím pádem mám v ObservableCollec­tion třídy s předpisem. Ale já chci předávat ke zpracování kolekce různých typů jejichž prvky teď máji shodný předpis. No, ale jak to pořešit. Udělat předpis na tu kolekci ? Obalit ji nějakou třídou takto ?

public class NováKolekce: TrulyObservableCollection<T> : where T : IPredpis

a IPredpis bude potom co? Metoda na vrácení ID?

 
Nahoru Odpovědět
31.10.2016 21:52
Avatar
Odpovídá na jan.pichl
Marian Benčat:31.10.2016 22:00
  1. Prosim pouzij Odpovědět, jinak mi to nedá vědět.. Jen autorovi Threadu
  2. Jestli budeš používat ve zdrojáku diakritiku, tak pujdes do pekla a bude te tam trestat lucifer
  3. Asi porad nerozuim uplne zadani...
    1. jak do kontejneru si pridal interface?
    2. takhle ti to nepujde.. nemá kde vzít to T.

Jestli chceš skutečně něco takového, jako si popsal tak už:

public class NovaKolekce<T>: TrulyObservableCollection<T> : where T : IPredpis

= je to nějaká třída a používá se tam někde T.. to musí být typu IPredpis..

Jestli chceš prostě udělat nějaký vlastní kontejner, za pomcoi existujících, tak to bdue třeba něco podobného...

public class MyContainer<T>{
  // Vnitrni uloziste - nejake..
 private   List<T> _data;

 Add(T newItem) {
  _data.Add(newItem);
}

}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
31.10.2016 22:00
Totalitní admini..
Avatar
jan.pichl
Člen
Avatar
Odpovídá na Marian Benčat
jan.pichl:1.11.2016 20:11

Díky za pomoc, funguje to paradně.

 
Nahoru Odpovědět
1.11.2016 20:11
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 5 zpráv z 5.