A más de uso general, más seguro, y la solución reutilizable a su problema podría ser la implementación de una, clase de propiedad genérico "parametrizado", así:
// 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
}
}
A continuación, puede aplicar cualquier número de propiedades dentro de su clase pública para que los clientes puedan set/get las propiedades con un índice, descriptor, clave de seguridad, o lo que sea, como esto:
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; }
}
}
Por último, el código de cliente podría acceder a las propiedades "parametrizados" de su clase pública como esto:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Claro, esto parece raro, pero definitivamente es el truco. Además, desde una perspectiva de código de cliente, no es raro en absoluto, es simple e intuitiva y actúa como propiedades reales. No infringe ninguna regla C# ni es incompatible con otros lenguajes administrados .NET. Y desde la perspectiva del implementador de clases, la creación de una clase de plantilla de propiedades reutilizable, genérica y "parametrizada" hace que la codificación de componentes sea relativamente fácil, como se muestra aquí.
NOTA: Siempre puede anular la clase de propiedad genérica para proporcionar un procesamiento personalizado, como búsqueda indexada, acceso a propiedad controlado por seguridad o lo que sea que desee.
¡Salud!
Mark Jones
Buena respuesta hombre. No sé por qué sugieres usar "" en lugar de String.Empty ... el original me parece más explícito. – Stimul8d
@ Stimul8d: No sigo. ¿Cómo es '" "' no explícito? La única diferencia que veo entre los dos (y que, en mi humilde opinión, un programador * debería * ver) es que 'String.Empty' es seis veces más larga, por lo tanto, toma seis veces más espacio y tarda ~ seis veces más para leerlo hace que el código sea seis veces peor. Como comparación, es como si usáramos 'Int32.Zero' en lugar de' 0'. –
unidireccional unicornio: ¡Acabo de usar el mismo argumento la semana pasada! –