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

C# .NET .NET (C# a Visual Basic) Generická metoda, pro různé kontejnery se stejnou vlastností American English version English version

Avatar
jan.pichl
Člen
Avatar
jan.pichl:

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. října 20:49
Avatar
Marian Benčat
Redaktor
Avatar
Marian Benčat:

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. října 21:15
 
Nahoru Odpovědět 31. října 21:12
Avatar
jan.pichl
Člen
Avatar
jan.pichl:

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. října 21:52
Avatar
Marian Benčat
Redaktor
Avatar
Odpovídá na jan.pichl
Marian Benčat:
  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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 31. října 22:00
Avatar
jan.pichl
Člen
Avatar
Odpovídá na Marian Benčat
jan.pichl:

Díky za pomoc, funguje to paradně.

 
Nahoru Odpovědět  +1 1. listopadu 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.