S'il vous plaît voir le code complet ci-dessous. fonctionne Ma solution comme:
var myForm = new Form();
var int_value = myForm.Fields
.OfType<IntegerFormField>()
.First(c => c.Name == "c1").GetValue();
var decimal_value = myForm.Fields
.OfType<DecimalFormField>()
.First(c => c.Name == "c2").GetValue();
Les interfaces de terrain:
public interface IFormField
{
object GetValue();
string Name { get; }
}
public interface IFormField<T> : IFormField
{
T GetValue();
}
La classe de base abstraite pour tous les champs de formulaire:
abstract class FormFieldBase<T> : IFormField<T>
{
private readonly T _value;
public FormFieldBase(T value, string name)
{
_value = value;
Name = name;
}
#region IFormField<T> Members
public virtual T GetValue()
{
return _value;
}
#endregion
#region IFormField Members
object IFormField.GetValue()
{
return _value;
}
public string Name { get; private set; }
#endregion
}
mise en œuvre du champ de formulaire Deux exemple:
class IntegerFormField : FormFieldBase<int>
{
public IntegerFormField(int value, string name) : base(value, name) { }
}
class DecimalFormField : FormFieldBase<decimal>
{
public DecimalFormField(Decimal value, string name) : base(value, name) { }
}
La classe de formulaire:
class Form
{
public IList<IFormField> Fields
{
get
{
return new List<IFormField>(){
new IntegerFormField(10, "c1"),
new DecimalFormField(200, "c2")
};
}
}
}
HTH
Plutôt que de discuter de ce que vous voulez que la signature de GetValue à ressembler, nous dire comment vous voulez écrire le consommateur de la liste des champs qui appelle GetValue. Pouvez-vous expliquer comment cette chose va être utilisée, parce que je ne comprends pas ce que vous voulez ici. –
La convention .Net est pour les noms de classe PascalCase, c'est-à-dire que chaque "mot" dans le nom d'une classe commence par une majuscule. Dans votre cas, remplace 'form' par' Form'. Vous pouvez voir la convention comme 'IList' et' FormField' sont PascalCased. 'String',' Int32' et d'autres types de base ont tous un équivalent minuscule, par exemple. 'string' et' int', mais c'est spécifique à C# et non exposé à l'extérieur. – Dykam
Je ne sais pas si c'est un doublon, mais cela serait-il utile pour vous: http://stackoverflow.com/questions/1848312/how-can-i-store-different-objects-in-a-single-list – Juliet