2010-05-26 4 views
3

S'il vous plaît voir un exemple de mon code ci-dessous:C# Constructor Problème lors de l'utilisation Generics

CODE MISE À JOUR

public class ScrollableCheckboxList 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList<TModel>(IEnumerable<TModel> items, string valueField, string textField, string titleField) where TModel : class 
    { 
     listitems = new List<ScrollableCheckboxItem>(); 
     foreach (TModel item in items) 
     { 
      Type t = typeof(TModel); 
      PropertyInfo[] props = new [] { t.GetProperty(textField), t.GetProperty(valueField), t.GetProperty(titleField) }; 
      listitems.Add(new ScrollableCheckboxItem 
      { 
       text = props[0].GetValue(item, null).ToString(), 
       value = props[1].GetValue(item, null).ToString(), 
       title = props[2].GetValue(item, null).ToString() 
      }); 
     } 
    } 
} 

EDIT Corrections de constructeur déclaration faite! Encore un problème avec ce code si

Le code ne compilera pas - il se présente avec beaucoup d'erreurs étranges qui me font penser qu'il y a un problème de conception ici?

Répondre

4

Comme d'autres l'ont souligné, vous devez supprimer le mot-clé void, mais ce n'est toujours pas correct. La déclaration générique devrait être mis sur la classe, et non le constructeur

public class ScrollableCheckboxList<TModel> 
    where TModel : class 
{ 
    public ScrollableCheckboxList(...) 
    { 
    // ... 
    } 
} 
3

Le nom de la fonction ScrollableCheckboxList est le même que votre nom de classe.

L'erreur elle-même est correcte, votre code ne l'est pas.

Vous souhaitez déclarer un constructeur, mais en ajoutant void avant le nom du constructeur, le compilateur C# pense qu'il s'agit d'une fonction. Et les fonctions ne peuvent pas avoir le même nom que la classe dans laquelle elles vivent (d'où l'erreur).

Donc, enlevez void devant le nom de la fonction, alors ce sera un constructeur.

Et spécifiez les contraintes TModel au niveau de la classe.

public /* void */ ScrollableCheckboxList /* <TModel> */(IEnumerable<TModel> items, string valueField, string textField, string titleField) /* where TModel : class */ 
+0

Un oubli stupide! Merci d'avoir fait remarquer cela. – Jimbo

+0

J'ai mis à jour le code ci-dessus, il ne compilera toujours pas et je ne comprends pas pourquoi (sans erreur définitive du compilateur!) – Jimbo

+0

Ok, trouvé le problème, la déclaration de classe doit définir l'objet générique TModel, pas le constructeur. Merci pour votre contribution. – Jimbo

0

Vous n'avez pas déclaré de constructeur. Il n'y a pas mot-clé void dans un constructeur:

public ScrollableCheckboxList<TModel>(IEnumerable<TModel> items, string valueField, string textField, string titleField) where TModel : class {} 

Un type ne peut pas contenir des méthodes qui ont le même nom que le type.

0

Ce n'est pas un constructeur, pour être un constructeur, vous devez supprimer le "vide" keywork.

0

Le constructeur doit être

public ScrollableCheckboxList<TModel> 

plutôt que

public void ScrollableCheckboxList<TModel> 

En d'autres termes, laissez tomber le vide.

2

PROBLÈME TROUVE

Le constructeur ne peut pas déclarer la définition TModel générique, la déclaration de classe doit faire ce travail

par exemple

public class ScrollableCheckboxList<TModel> where TModel : class 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList(IEnumerable<TModel> items, string valueField, string textField, string titleField) 
    { 
     ... 
2

Vous ne pouvez pas avoir de constructeur prenant des paramètres génériques. Vous devez soit déplacer le paramètre générique au niveau de la classe, soit faire du paramétrage des éléments une méthode qui prend un paramètre générique.

public class ScrollableCheckboxList<TModel> 
    where TModel : class 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList(IEnumerable<TModel> items, string valueField, string textField, string titleField) 
    { 
     listitems = new List<ScrollableCheckboxItem>(); 
     foreach (TModel item in items) 
     { 
      Type t = typeof(TModel); 
      PropertyInfo[] props = new [] { t.GetProperty(textField), t.GetProperty(valueField), t.GetProperty(titleField) }; 
      listitems.Add(new ScrollableCheckboxItem 
      { 
       text = props[0].GetValue(item, null).ToString(), 
       value = props[1].GetValue(item, null).ToString(), 
       title = props[2].GetValue(item, null).ToString() 
      }); 
     } 
    } 
} 

Cela devrait fonctionner correctement, bien que je vous recommande également de ne pas exposer la variable membre List directement.