Toon posts:

[C#/Generics] 'T' does not contain a definition for ... hmm

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hi,

In een class roep ik mijn methode FillCache() aan
code:
1
FillCache(new AdministrationOption(), TBC.c_administration_options);


In mijn methode FillCache()
code:
1
2
3
4
private void FillCache<T>(T objpCachedObject, string strpCachingTarget)
{
    objpCachedObject.Connect();
}
roep ik de methode Connect() aan van het meegegeven object.

Mijn class AdministrationOption hééft een public methode Connect().

Tijdens het compileren krijg ik een foutmelding: 'T' does not contain a definition for 'Connect'

Heeft iemand enig idee hoe ik dit generiek kan oplossen? Ik heb meerdere klasses die ik via deze zelfde methode wil afhandelen zodat er zoveel mogelijk code herbruikt kan worden.

Alvast bedankt!
Statix

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:56

.oisyn

Moderator Devschuur®

Demotivational Speaker

een T zonder constraints garandeert niet dat er een Connect() method bestaat, dus die kun je ook niet op een object van type T aanroepen (T is dan in feite gewoon een Object). Je zult een constraint op T moeten definieren zodat T minstens van een type is dat een Connect method heeft.

Je kunt je afvragen waar je generics in dit geval voor nodig hebt, ipv een generic method zou je ook gewoon een normale method kunnen definieren waarbij je ipv T gewoon de class/interface specificeert die Connect() implementeert.

Je tekst lijkt echter te impliceren dat je geen generieke interface hebt, maar dat verschillende ongerelateerde typen objecten gewoon een Connect() methode implementeren. Dat werkt helaas niet, je zult een common interface of class moeten definieren (wat OO-gewijs waarschijnlijk ook nog eens een betere oplossing is) die je verschillende klassen implementeren

[ Voor 61% gewijzigd door .oisyn op 06-11-2006 16:38 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
pffff

dat ik daar niet aan gedacht heb :) het is super simpel
code:
1
2
3
4
private void FillCache<T>(T objpCachedObject, string strpCachingTarget) where T : TableBase
{
    objpCachedObject.Connect();
}


In mijn geval extend elke klasse die Connect() aan moet roepen van klasse TableBase waar Connect() in zit verwerkt.

De data wordt ge-cached door een aparte klasse, en anders moet ik 8 keer dezelfde code gaan kopieeren + plakken en dan alleen klasse naam aanpassen... lijkt me ook niet echt 'je van het'

Bedankt _/-\o_

[ Voor 22% gewijzigd door Verwijderd op 06-11-2006 16:46 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 21:56

.oisyn

Moderator Devschuur®

Demotivational Speaker

Maar waarom dan generics en niet gewoon dit:

C#:
1
2
3
4
private void FillCache(TableBase objpCachedObject, string strpCachingTarget)
{
    objpCachedObject.Connect();
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Omdat er nog meer moet gebeuren, klasse specifiek, naast het connecten :)

Jouw methode werkt wel, had ik zelf eerlijk gezegd niet aangedacht.

Bedankt voor het meedenken! :) als er nog iets anders mogelijk is ..... :9