2010-09-02 5 views
2

Je restructure actuellement mon programme pour qu'il soit plus orienté objet et j'ai des problèmes avec les constructeurs de mes objets. Tous les objets sont stockés dans une base de données qui doit être lisible par un humain, donc je me suis dit que ce serait bien que le programmeur passe directement le constructeur d'un objet à la table ou à la table de données.C# Paramètre du constructeur passant

Alors, ce que je voulais faire était le suivant:

public TestObject(Data.MyDataTable table) { 
// Some checks if the table is valid 
TestObject(table[0]); 
} 

public TestObject(Data.MyDataRow row) { 
// Some checks if the row is valid 
TestObject(row.Name, row.Value); 
} 

public TestObject(String name, String value) { 
// Some checks if the strings are valid 
_name = name; 
_value = value; 
} 

Alors, comme vous le voyez, je veux en quelque sorte une « chaîne de constructeur » qui, selon la façon dont le programmeur appelle, les valeurs sont transmises à travers et validé à chaque étape. Je l'ai essayé comme je l'ai écrit, mais ça n'a pas marché.

Error 'TestObject' is a 'type' but is used like a 'variable' 

J'ai aussi essayé d'écrire this.TestObject(...) mais aucun changement.

Error 'TestObject' does not contain a definition for 'TestObject' and 
no extension method 'TestObject' accepting a first argument of type 
'TestObject' could be found 

Comment puis-je faire à ce sujet?

+1

"Cela n'a pas fonctionné". Qu'est-ce qui n'a pas fonctionné? Quels étaient les problèmes? – Oded

+0

@Oded: Le message d'exception est clairement indiqué, et à partir du code, il est facile de voir quel est le problème ... – gehho

+0

@gehho J'ai ajouté l'exception après avoir demandé. Rien à reprocher;) –

Répondre

2

Constructor chaining œuvres comme ça:

public TestObject(Data.MyDataTable table) : this(table[0]) 
{ 

} 

public TestObject(Data.MyDataRow row) : this(row.Name, row.Value) 
{ 

} 

public TestObject(String name, String value) 
{ 
// Some checks if the strings are valid 
_name = name; 
_value = value; 
} 
+2

@ ApoY2K - Vous pouvez intercepter l'exception lors de la construction de l'objet 'TestObject'. – Oded

+1

Vous pouvez également faire quelque chose comme ceci pour éviter que les paramètres 'null' ou vides ne lèvent des exceptions:' public TestObject (table Data.MyDataTable): this ((table! = Null && table.Rows.Count> 0)? Table [0 ]: null) ' – gehho

7

Vous chain constructors comme ceci:

public TestObject(Data.MyDataTable table) : this(table[0]) 
{ 

} 

public TestObject(Data.MyDataRow row) : this(row.Name, row.Value) 
{ 

} 

public TestObject(String name, String value) 
{ 
// Some checks if the strings are valid 
_name = name; 
_value = value; 
} 

Note: L'utilisation du mot-clé this pour indiquer l'objet courant, l'utilisation des paramètres qui sont passés dans à un constructeur au constructeur chaîné.

Questions connexes