Springen naar inhoud

Bekend type converteren naar custom type


  • Log in om te kunnen reageren

#1

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 19 augustus 2009 - 13:07

Kan ik een bekend type zoals een string converteren naar een zelfgemaakte klasse?

Hierbij een stukje voorbeeldcode:

public List<Verbinding> HaalVerbindingen()
{
String query = "SELECT * FROM Verbinding";
OleDbCommand command;
command = new OleDbCommand(query, connection);
connection.Open();

OleDbDataReader reader;
reader = command.ExecuteReader();

List<Verbinding> tempVerbindingen = new List<Verbinding>();
while (reader.Read())
{
Station Vertrekstation = (Station)reader["Vertrekstation"];
Station Aankomststation = (Station)reader["Aankomststation"];
int Verbindingsafstand = Convert.ToInt32(reader["Verbindingsafstand"]);
int MaximaleSnelheid = Convert.ToInt32(reader["Maximale snelheid"]);
tempVerbindingen.Add(new Verbinding(Vertrekstation, Aankomststation, Verbindingsafstand, MaximaleSnelheid));
}

reader.Close();
connection.Close();
if (tempVerbindingen[0] != null)
return tempVerbindingen;
else
return null;
}

Het probleem is dat vertrekstation en aankomststation als een string in mijn database staan. Mijn klasse verbinding heeft echter vertrek- en aankomststation van type Station nodig.

Veranderd door Redmess, 19 augustus 2009 - 13:12


Dit forum kan gratis blijven vanwege banners als deze. Door te registeren zal de onderstaande banner overigens verdwijnen.

#2

Bart

    Bart


  • >5k berichten
  • 7224 berichten
  • VIP

Geplaatst op 19 augustus 2009 - 13:40

Dat kan mits je voor de klasse Station een conversion operator hebt geschreven. Zie http://msdn.microsof...zf4(VS.80).aspx
If I have seen further it is by standing on the shoulders of giants.-- Isaac Newton

#3

Redmess

    Redmess


  • >100 berichten
  • 185 berichten
  • Ervaren gebruiker

Geplaatst op 19 augustus 2009 - 23:14

Ik heb de volgende oplossing gevonden:

string vertrekstationNaam = (String)reader["Vertrekstation"];
Station Vertrekstation = new Station(vertrekstationNaam);
string aankomststationNaam = (String)reader["aankomststation"];
Station Aankomststation = new Station(aankomststationNaam);

Hiermee is het probleem dus verholpen.

#4

virtlink

    virtlink


  • >100 berichten
  • 158 berichten
  • Ervaren gebruiker

Geplaatst op 20 augustus 2009 - 14:45

Het kan nog ietsje korter en IMO overzichtelijker:
Station vertrekstation = new Station((string)reader["Vertrekstation"]);

Station aankomststation = new Station((string)reader["Aankomststation"]);
Scheelt twee variabelen die je toch niet meer gebruikt.

Als je Bart's suggestie gebruikt, dan kan dit ook:
Station vertrekstation = (Station)reader["Vertrekstation"];

Station aankomststation = (Station)reader["Aankomststation"];
met een operator-methode de volgende signatuur in de Station klasse:
public static explicit operator Station(object naam)
{
	string naamStr = naam as String;
	if (naamStr == null)
		throw new ArgumentException("naam");
	// ... return iets
}

En als je 'explicit' in bovenstaand voorbeeld vervangt door 'implicit', werkt zelfs dit (maar ik raad het niet aan vanwege de onduidelijkheid over wat er nu gebeurt):
Station vertrekstation = reader["Vertrekstation"];

Station aankomststation = reader["Aankomststation"];
Pas wel op dat bijvoorbeeld 'Station s = 10' of 'Station s = new Trein()' nu ook compileert maar niet gewenst is en exceptions gooit bij de uitvoer.
"Niet gehinderd door enige kennis van zaken..."





0 gebruiker(s) lezen dit onderwerp

0 leden, 0 bezoekers, 0 anonieme gebruikers

Ook adverteren op onze website? Lees hier meer!

Gesponsorde vacatures

Vacatures