Un plus polyvalent, plus sûr, et d'une solution réutilisable à votre problème pourrait être la mise en œuvre d'un générique, la classe de propriété « paramétrés », comme ceci:
// Generic, parameterized (indexed) "property" template
public class Property<T>
{
// The internal property value
private T PropVal = default(T);
// The indexed property get/set accessor
// (Property<T>[index] = newvalue; value = Property<T>[index];)
public T this[object key]
{
get { return PropVal; } // Get the value
set { PropVal = value; } // Set the value
}
}
Vous pouvez ensuite mettre en œuvre un certain nombre de propriétés au sein de votre public class afin que les clients puissent établis/obtenir les propriétés avec un index, descripteur, clé de sécurité, ou autre, comme celui-ci:
public class ParameterizedProperties
{
// Parameterized properties
private Property<int> m_IntProp = new Property<int>();
private Property<string> m_StringProp = new Property<string>();
// Parameterized int property accessor for client access
// (ex: ParameterizedProperties.PublicIntProp[index])
public Property<int> PublicIntProp
{
get { return m_IntProp; }
}
// Parameterized string property accessor
// (ex: ParameterizedProperties.PublicStringProp[index])
public Property<string> PublicStringProp
{
get { return m_StringProp; }
}
}
Enfin, le code client aurait accès à des propriétés « paramétrés » de votre classe publique comme ceci:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Bien sûr, cela semble bizarre, mais ça fait vraiment l'affaire. En outre, du point de vue du code client, ce n'est pas du tout bizarre - c'est simple et intuitif et il agit comme de vraies propriétés. Il ne rompt pas les règles C# et n'est pas non plus incompatible avec les autres langages gérés .NET. Et du point de vue de l'implémenteur de classes, la création d'une classe de modèles de propriétés «paramétrables», génériques et réutilisables rend le codage des composants relativement facile, comme illustré ici. REMARQUE: vous pouvez toujours remplacer la classe de propriété générique pour fournir un traitement personnalisé, tel que la recherche indexée, l'accès aux propriétés contrôlé par la sécurité ou tout ce que vous voulez.
À la votre!
Mark Jones
Belle réponse man. Je ne sais pas pourquoi vous suggérez d'utiliser "" au lieu de String.Empty cependant, ... l'original me semble plus explicite. – Stimul8d
@ Stimul8d: Je ne suis pas. Comment '' "" 'n'est pas explicite? La seule différence que je vois entre les deux (et que, à mon humble avis, un programmeur * devrait * voir) est que String.Empty est six fois plus long, donc cela prend six fois plus d'espace et prend six fois plus de temps pour lire cela rend le code six fois pire. À titre de comparaison, c'est comme si nous utilisions 'Int32.Zero' au lieu de' 0'. –
licorne nez: Je viens d'utiliser le même argument la semaine dernière! –