Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Kako da queryjem da li klasa implementira interfejs

  • 9 odgovora
  • 4.021 pregleda

Najnovija ↓

Kako da queryjem da li klasa implementira interfejs 27.05.2007. u 19:10 · pre 236 meseci #1
Mozda glupo pitanje, ali nikako ne mogu da nadjem kako u C#-u da testiram da li klasa ili instanca klase implementira odredjeni interfejs, cini mi se da IS ne radi...
Re: Kako da queryjem da li klasa implementira interfejs 28.05.2007. u 16:11 · pre 236 meseci #2
IS radi savrseno i kroz tip i kroz instancu, evo ti primer kroz nasledjenu klasu:

Code:

    interface I1 { }
    interface I2 { }
    class C { }
    class CJedan : C, I1 { }
    class COba : C, I1, I2 { }


    class Program
    {
        static void Main(string[] args)
        {
            C inst1 = new CJedan();
            C inst2 = new COba();

            Console.WriteLine(inst1 is I1);
            Console.WriteLine(inst1 is I2);
            Console.WriteLine(inst2 is I1);
            Console.WriteLine(inst2 is I2);
            Console.ReadLine();

        }
    }


Daje true, false, true, true.

Zasto mislis da ne radi?
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Kako da queryjem da li klasa implementira interfejs 28.05.2007. u 21:35 · pre 236 meseci #3
U designtime-u ne radi, u runtime-u radi...

Pokusacu da izolujem problem pa cu postovati malo kasnije. Sustina je da u set accesor-u za jedan property proveravam da li prosledjeni objekat implementira odredjeni interfejs i ako ga ne implementira onda dizem Exception. U designtime-u kada dodelim vrednost property-u dobijam svoj vlastiti exception, kada isto uradim u runtime-u radi bez problema. Ali kao sto rekoh, probacu da izolujem problem pa cu ga postovati. Mozda sam stvarno i ja nesto zajebo...
Btw., interfejs implemetiram u partial klasi, znaci "doradjujem" ono sto VS napravi automatski (konkretno DataTable u datasetu)
Re: Kako da queryjem da li klasa implementira interfejs 28.05.2007. u 22:33 · pre 236 meseci #4
Evo izolovao sam problem. Postoje 4 fajla: class1.cs, Dataset1.xsd, Form1.cs i Component1.cs i njihovi .Design i ostali repovi. U class1.cs je definisan prost interfejs za property TestInt, u Dataset1.xsd je Datatable1 dopunjen da podrzava taj interfejs, a Component1 ima property tipa DataTable koji u svom set accesoru proverava da li prosledjeni datatable implemetira pomenuti interfejs, preko IS operatora.

Form1 je test forma, kada u runtime-u kliknes na button1 vidis da je sve OK, kada u designtime-u za component1.TestTable izaberes dataset1.dataTable1 dobijes nebulozni exception.

Problem naravno nije sa IS operatorom nego (opet) sa VS-om 2k5 SP1....
Re: Kako da queryjem da li klasa implementira interfejs 28.05.2007. u 23:36 · pre 236 meseci #5
ping back :)

Probaj da prebacis tvoju komponentu i dataset u novi projkekat (Class library) ovako ces dobiti 'sveze' klase.
Jos jedna stvar koja mi je zapala za oci je zasto ne bi odmah deklarisao property kao taj interfejs, dobices odmah u designeru moguce instance za izbor.

Code:

        private ITestIntf anotherTable;
        public ITestIntf AnotherTable
        {
            get { return anotherTable; }
            set
            {
                if (value != null && (!(value is ITestIntf)))
                        throw new Exception("Nece");

                anotherTable = value;
            }
        }


Evo mali prekrojeni primer.
Re: Kako da queryjem da li klasa implementira interfejs 29.05.2007. u 00:39 · pre 236 meseci #6
Citat:

Jos jedna stvar koja mi je zapala za oci je zasto ne bi odmah deklarisao property kao taj interfejs, dobices odmah u designeru moguce instance za izbor


Zato sto mi treba da je taj propery tipa DataTable, kada bi deklarisao property kao taj interfejs morao bih posle da cast-ujem svuda u DataTable, sto ne znam ni da li bi upalilo (ne znam da li mozes da explicitno castujes neki interfejs u neku klasu, nisam probao). Druga stvar, ono MORA da radi bez ikakvih "3x ochenash i trchi oko kuce 2x", jer radi bez problema u #dev-u 2.1, ne radi u VS-u.

Uopste mi ne ide u glavu kako dodje do tog exceptiona, ocigledno ne prodje proveru if(value is ITestIntf) i onda prvo sto sam pomislio je bilo da se "is" ne koristi za queryovanje interfejsa, posle sam tek video Miljanov post i proverio da u runtime-u zaista radi.

Jos jedan VS bug? :)

Re: Kako da queryjem da li klasa implementira interfejs 29.05.2007. u 01:24 · pre 236 meseci #7
Pazi, ono resenje interfejs kao porperty te nece spasiti od ovog bug-a, to sam ti onako usput spomenuo, jer u slucaju da hoces da iskoristis funkcionalnost samo tog interfejsa onda ti je dovoljno ali kao sto si i sam primetio ukoliko ti treba DataTable ceo, onda i nije neko resenje, mada mozes da castujes a mozes i da deklarises jedan peroperty\metod GetDataTable u interfejsu :)

Sto se tice if-a, ne preskace ga, radi on fino ali sve ostalo ne radi ;) Mozes debugirati taj deo pa videti (debug->attach to proccess, stavis pre toga breakpoint gde zelis i isto pre toga otvoris isti projekat u novom VS-u i odatle pokusas da promenis nesto, mada tek ovo je bugovito ali pomaze... nekad :)) problem je izgleda do kompajliranja ili bolje receno nekompajliranja, posto code koji se nalazi u trenutnom projektu designer ne vidi, a ako stavis sve to u novi projekat onda vidi.

Citat:

Jos jedan VS bug?


Jbg. (nadam se da me nece ukoriti :))
Re: Kako da queryjem da li klasa implementira interfejs 29.05.2007. u 13:51 · pre 236 meseci #8
@nexygo: ako promenis tip propertija u ITestIntf onda ne moras da proveravas da li implementira taj interfejs posto ce kompajler spreciti assignment ako nije.

@_v!rus_: cestitam, otkrio si jos jedan bug u VS2005. :) Definitivno ima veze sa partial klasama i VS vidi samo interfejse deklarisane u primarnoj deklaraciji parcijalne klase (tamo gde je definisano koju klasu nasledjuje), posto radi kad umesto tvog interfejsa proverim da li postoji npr IEnumerable (pogledaj deklaraciju DataTable1), kod prolazi bez problema.

Cisto da ilustrujem dubinu buga koji si otkrio, ako u komponenti promenis testTable tip iz DataTable u DataSet1.DataTable1 prodje provera, tj sad vidi interfejs, ali pukne na dodeli na kraju i kaze da ne moze da castuje sebe u sebe ;) sto moze da bude indikacija da tip nije formiran ispravno od strane VSa.

Code:

Object of type 'WindowsApplication2.DataSet1+DataTable1DataTable' 
cannot be converted to type 'WindowsApplication2.DataSet1+DataTable1DataTable'.


jedino resenje koje ja vidim je nexygovo, prebaci komponentu i dataset u drugi assembli/projekat (zakacio sam ti tvoj preradjeni solution). Posto ovo radi kako treba, jedini zakljucak je da postoji bug u VS u delu koji radi sa prekompajliranjem tipova iz EXE projekata (koji ne mogu da se ucitaju kao nezavisni asembliji u VS kao sto to mogu DLL projekti).
Predlazem da ostavis feedback na MSDNu, mozda nazovu bug po tebi ;)

Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Re: Kako da queryjem da li klasa implementira interfejs 29.05.2007. u 15:29 · pre 236 meseci #9
Citat:

@nexygo: ako promenis tip propertija u ITestIntf onda ne moras da proveravas da li implementira taj interfejs posto ce kompajler spreciti assignment ako nije.


Samo da spomenem... bilo je kasno sinoc... :)
Re: Kako da queryjem da li klasa implementira interfejs 29.05.2007. u 15:44 · pre 236 meseci #10
Citat:
negyxo: Samo da spomenem... bilo je kasno sinoc... :)

hehe, pretpostavljao sam, al je moralo da se kaze :)
Potpis
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme