Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako da queryjem da li klasa implementira interfejs

[es] :: .NET :: Kako da queryjem da li klasa implementira interfejs

[ Pregleda: 2818 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.dsl.siol.net.



+1 Profil

icon Kako da queryjem da li klasa implementira interfejs27.05.2007. u 18:10 - pre 204 meseci
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...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs28.05.2007. u 15:11 - pre 204 meseci
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?
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ć
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.dsl.siol.net.



+1 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs28.05.2007. u 20:35 - pre 204 meseci
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)
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.dsl.siol.net.



+1 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs28.05.2007. u 21:33 - pre 204 meseci
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....
Prikačeni fajlovi
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs28.05.2007. u 22:36 - pre 204 meseci
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.
Prikačeni fajlovi
 
Odgovor na temu

_v!rus_
BGD

Član broj: 40451
Poruke: 313
*.dsl.siol.net.



+1 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs28.05.2007. u 23:39 - pre 204 meseci
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?

 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs29.05.2007. u 00:24 - pre 204 meseci
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 )
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs29.05.2007. u 12:51 - pre 204 meseci
@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


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ć
Prikačeni fajlovi
 
Odgovor na temu

negyxo
Aleksandar Perkuchin

Član broj: 29751
Poruke: 898
*.sksyu.net.



+171 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs29.05.2007. u 14:29 - pre 204 meseci
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...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: Kako da queryjem da li klasa implementira interfejs29.05.2007. u 14:44 - pre 204 meseci
Citat:
negyxo: Samo da spomenem... bilo je kasno sinoc... :)

hehe, pretpostavljao sam, al je moralo da se kaze :)
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ć
 
Odgovor na temu

[es] :: .NET :: Kako da queryjem da li klasa implementira interfejs

[ Pregleda: 2818 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.