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...
Kako da queryjem da li klasa implementira interfejs
Zaključano
Zakačeno
IS radi savrseno i kroz tip i kroz instancu, evo ti primer kroz nasledjenu klasu:
Daje true, false, true, true.
Zasto mislis da ne radi?
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();
}
}
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ć
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ć
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)
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)
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....
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....
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.
Evo mali prekrojeni primer.
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;
}
}
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.
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?
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.
Jos jedan VS bug?
Jbg. (nadam se da me nece ukoriti
)
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
@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.
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
@_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'.
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ć
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ć
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...
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ć
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ć