[ _v!rus_ @ 27.05.2007. 18:10 ] @
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...
[ mmix @ 28.05.2007. 15:11 ] @
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?
[ _v!rus_ @ 28.05.2007. 20:35 ] @
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)
[ _v!rus_ @ 28.05.2007. 21:33 ] @
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....
[ negyxo @ 28.05.2007. 22:36 ] @
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.
[ _v!rus_ @ 28.05.2007. 23:39 ] @
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?

[ negyxo @ 29.05.2007. 00:24 ] @
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 )
[ mmix @ 29.05.2007. 12:51 ] @
@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

[ negyxo @ 29.05.2007. 14:29 ] @
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...
[ mmix @ 29.05.2007. 14:44 ] @
Citat:
negyxo: Samo da spomenem... bilo je kasno sinoc... :)

hehe, pretpostavljao sam, al je moralo da se kaze :)