Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[C#] Dynamic typing of toch iets anders?

Pagina: 1
Acties:

  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Ik ben bezig met een soort mailmerge vanuit ons CRM systeem. Het CRM systeem levert via een webservice per "entiteit" een klasse aan met voor elk veld in de "entiteit" een property. Een entiteit kan een contact, een bedrijf etc zijn. De webservice wordt dynamisch gegeneerd, als een entiteit aangepast wordt veranderd de webservice ook automatisch.

Wat ik nu doe:
- Ik kijk welke velden er gevraag worden.
- Ik haal de gevraagde entiteit op via de webservice.
- Ik haal mbv reflection de gevraagde data uit de properties.

Dit werkt perfect, is geheel dynamisch en "onderhoudsvrij".

Waar ik niet helemaal uitkom is het volgende. Het bovenstaande werkt alleen voor een bepaalde entiteit/klasse. Ik moet namelijk het result als volgt op vragen (pseudocode):

C#:
1
account results = (account)webservice.getData(guid, EntityType.account)


Ik moet expliciet opgeven wat het type is en een cast doen. De oplossing is misschien heel simpel maar hoe kan ik dit dynamisch maken?

Andere vraag, maar zover ben ik nog niet. Het is een console applictie, om de webservice aan te spreken heb ik een proxy klasse moeten genereren, is dit ook dynamisch te maken?

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 05-09 14:39

_Thanatos_

Ja, en kaal

Zoiets moet je helemaal niet willen. Het hele idee van een niet veranderende WSDL is juist dat de client en server van elkaar weten wat er verwacht kan worden. Je kunt net zo goed stoppen met het gebruik van SOAP (aanname door je bewoording "webservice") en zelf iets verzinnen, maar daarmee vererger je het probleem, terwijl ik vind dat je het bij de bron moet aanpakken: gebruik geen dynamische code, het is geen javascript.

Dat gezegd hebben, het antwoord op je concrete vraag is vgs mij heel simpel: kan niet :)

日本!🎌


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
PolarBear schreef op woensdag 06 augustus 2008 @ 23:14:
Dit werkt perfect, is geheel dynamisch en "onderhoudsvrij".
Niet helemaal mee eens. Je code blijft wel compilen, maar at runtime kan je code breken als een bepaalde property opeens (door een aangepaste webservice) niet meer beschikbaar is.
Ik moet expliciet opgeven wat het type is en een cast doen. De oplossing is misschien heel simpel maar hoe kan ik dit dynamisch maken?
In tegenstelling tot wat er hierboven gezegd wordt kan het wel dynamisch, maar zoals hij terecht zegt: dat moet je niet willen. Het is idd geen javascript.

Mijn suggestie zou zijn, gebruik de ServiceDescriptionImporter om een tool te schrijven die een getweakte proxy genereert, maar genereer je proxy @ compile-time (bijv. als onderdeel van je build-cyclus). Je code die de proxy gebruikt breekt dan op het moment dat je naar een niet langer bestaande property verwijst, i.e. je krijgt compile time checking.

Daar wordt je veel gelukkiger van :)

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Waarom doe je überhaupt een cast? Je kunt het toch gewoon een object laten? Reflection ziet gewoon de volledige class. Alleen je code zelf kan er wat minder gemakkelijk mee omgaan.

Via (System.ComponentModel.)TypeDescriptor.GetProperties() krijg je eenvoudig een array met de properties (PropertyDescriptor) terug. De PropertyDescriptor heeft een methode GetValue welke een instance van een class/structure verwacht.

If it isn't broken, fix it until it is..


  • PolarBear
  • Registratie: Februari 2001
  • Niet online
Niemand_Anders schreef op donderdag 07 augustus 2008 @ 08:24:
Waarom doe je überhaupt een cast? Je kunt het toch gewoon een object laten? Reflection ziet gewoon de volledige class. Alleen je code zelf kan er wat minder gemakkelijk mee omgaan.

Via (System.ComponentModel.)TypeDescriptor.GetProperties() krijg je eenvoudig een array met de properties (PropertyDescriptor) terug. De PropertyDescriptor heeft een methode GetValue welke een instance van een class/structure verwacht.
Dat is inderdaad zo, ik was net met deze oplossing bezig. Een nachtje slaap doet wonderen _/-\o_