[ _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... |
[ _v!rus_ @ 27.05.2007. 18:10 ] @
[ 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 ![]() ![]() 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. ![]() 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 ![]() 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 :) Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|