Tengo un objeto (formulario) que contiene una colección (.Fields) que quiero contener instancias de una clase genérica (FormField).Colección de tipos genéricos
El FormField, simplemente, se define como tal:
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;
}
}
Esto me permite tener FormField, FormField etc., y esa parte funciona muy bien. Lo que yo quiero es una colección de "FormFields" sin importar el tipo, pero me veo obligado a definir un tipo (parece), tales como:
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; }
}
¿Cuál es, creo, lo que quiero es una interfaz que permite me abstraer la información de tipo y por lo tanto escriba la colección como ejemplos de (por exxample) no IFormField FormField <>
Pero no puedo ver cómo definir esta fuerza sin necesidad de escribir la colección en la interfaz ...
¡Cualquier ayuda (incluidas las soluciones alternativas!) Sería muy apreciada.
Gracias, Ben
gracias Jon, pero si te entiendo correctamente, entonces la interfaz efectivamente tendría todo excepto la propiedad de valor, que es un elemento clave de FormField ..? ¿Estoy tratando de usar genéricos de la manera incorrecta? – Ben
@Ben: Considere cómo trataría de * usar * esta colección. Podría tener una mezcla de diferentes tipos de campos de formulario (int, cadena, etc.). ¿Cómo tratarías de usar los valores de esos campos de formulario dentro de 'Form'? No los sabrá en tiempo de compilación, o estará lanzando explícitamente al tipo correcto. –
@Ben, puede declarar una propiedad Value en la interfaz IFormField, pero deberá declararla como Object. En la clase FormField, declare el valor como T e implemente IFormField.Value explícitamente. –