Ein Allzweck-, sicherer und wiederverwendbare Lösung für Ihr Problem könnte eine generische „parametrisiert“ Festigkeitsklasse, wie diese Umsetzung sein:
// 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
}
}
Sie dann eine beliebige Anzahl von Eigenschaften implementieren könnte in Ihrem public class so dass die Kunden könnten eingestellt/die Eigenschaften mit einem Index erhalten, Beschreiber, Sicherheitsschlüssel oder was auch immer, wie folgt aus:
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; }
}
}
Schließlich Client-Code würde Ihre öffentlichen Klasse „parametrisiert“ Eigenschaften wie folgt zugreifen:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Sicher, das scheint seltsam, aber es ist definitiv der Trick. Außerdem ist es aus einer Client-Code-Perspektive überhaupt nicht seltsam - es ist einfach und intuitiv und verhält sich genau wie echte Eigenschaften. Es bricht keine C# -Regeln und ist auch nicht mit anderen von .NET verwalteten Sprachen kompatibel. Und aus Sicht des Klassenimplementierers macht das Erstellen einer wiederverwendbaren, generischen, "parametrisierten" Eigenschaftsvorlagenklasse die Komponentencodierung relativ einfach, wie hier gezeigt.
ANMERKUNG: Sie können die generische Eigenschaftsklasse jederzeit überschreiben, um benutzerdefinierte Verarbeitung bereitzustellen, z. B. indizierte Suche, Zugriff auf sicherheitsgesteuerte Eigenschaften oder was immer Sie wollen.
Prost!
Mark Jones
Schöne Antwort Mann. Ich weiß nicht, warum Sie vorschlagen "" anstelle von String.Empty, aber ... das Original scheint mir expliziter. – Stimul8d
@ Stimul8d: Ich folge nicht. Wie ist '' '' nicht explizit? Der einzige Unterschied, den ich zwischen den beiden sehe (und das, IMHO, ein Programmierer * sollte * sehen) ist, dass 'String.Empty' sechsmal länger ist, daher braucht es sechsmal mehr Speicherplatz und dauert ~ sechsmal länger, um es zu lesen es macht den Code sechsmal schlimmer. Zum Vergleich: Als würden wir 'Int32.Zero' anstelle von' 0' verwenden. –
gerochenes Einhorn: Ich habe letzte Woche das gleiche Argument benutzt! –