J'ai un objet (formulaire) qui contient une collection (.Fields) que je veux contenir des instances d'une classe générique (FormField).Collection de types génériques
Le FormField, tout simplement, est défini comme tel:
public class FormField<T>
{
private Form Form;
public T Value { get; set; }
public string Name { get; set; }
public void Process()
{
// do something
}
public FormField(Form form, string name, T value)
{
this.Name = name;
this.Value = value;
this.Form = form;
}
}
Cela me permet d'avoir FormField, FormField etc., et cette partie fonctionne très bien. Ce que je veux est une collection de « FormFields » quel que soit le type, mais je suis forcé dans la définition d'un type (il semble) tels que:
public class Form
{
string Code { get; set; }
string Title { get; set; }
int Year { get; set; }
Guid ClientID { get; set; }
ICollection<FormField<int>> Fields { get; set; }
}
Qu'est-ce que je pense, je veux est une interface qui permet moi abstraire les informations de type et donc taper la collection comme des instances de (pour exxample) IFormField pas FormField <>
Mais je ne vois pas comment définir ce sans avoir à taper fortement la collection dans l'interface ...
Toute aide (y compris les solutions alternatives!) Serait grandement appréciée!
Merci, Ben
merci Jon, mais si je vous comprends bien alors l'interface aurait effectivement tout sauf la propriété value, qui est un élément clé de la FormField ..? Est-ce que j'essaie d'utiliser des génériques dans le mauvais sens peut-être? – Ben
@Ben: Considérez comment vous essaieriez * d'utiliser * cette collection. Il pourrait avoir un mélange de différents types de champs de formulaire (int, string, etc.). Comment essaieriez-vous d'utiliser les valeurs de ces champs de formulaire dans 'Form'? Vous ne les connaitrez pas au moment de la compilation, ou vous lancerez explicitement le bon type. –
@Ben, vous pouvez déclarer une propriété Value dans l'interface IFormField, mais vous devrez le déclarer en tant qu'objet. Dans la classe FormField, déclarez Value comme T et implémentez IFormField.Value explicitement. –