bardziej ogólnego przeznaczenia, bezpieczniejsze i wielokrotnego użytku Rozwiązaniem problemu może być wdrożenie rodzajowego, „parametryczne” klasę własności, podobnie jak to:
// 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
}
}
Następnie można realizować dowolną liczbę nieruchomości w swoim public class, dzięki czemu klienci mogą ustawić/uzyskać właściwości z indeksem, deskryptor, klucz bezpieczeństwa, czy cokolwiek, na przykład:
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; }
}
}
Wreszcie, kod klienta będzie dostęp „parametrami” właściwości swój publiczny klasa jest tak:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Oczywiście, wydaje się to dziwne, ale zdecydowanie działa. Poza tym, z perspektywy kodu klienta, nie jest wcale dziwna - jest prosta i intuicyjna i działa jak prawdziwe nieruchomości. Nie łamie żadnych reguł C#, ani nie jest niezgodny z innymi językami zarządzanymi .NET. Z perspektywy implementatora klas tworzenie ogólnej, "sparametryzowanej" klasy szablonów właściwości do wielokrotnego użytku sprawia, że kodowanie komponentów jest względną bryzą, jak pokazano tutaj.
UWAGA: Zawsze można nadpisać ogólną klasę właściwości, aby zapewnić niestandardowe przetwarzanie, takie jak indeksowane wyszukiwanie, dostęp do właściwości kontrolowanych przez zabezpieczenia lub dowolne, jakie chcesz.
Pozdrawiam!
Mark Jones
Miła odpowiedź człowieka. Nie wiem, dlaczego sugerujesz użycie "" zamiast String.Empty chociaż, ... oryginał wydaje mi się bardziej wyraźny. – Stimul8d
@ Stimul8d: Nie śledzę. W jaki sposób '' "' nie jest wyraźny? Jedyną różnicą, jaką widzę pomiędzy tymi dwoma elementami (i tym, IMHO, programista * powinien * zobaczyć), jest to, że 'String.Empty' jest sześć razy dłuższy, dlatego zajmuje sześć razy więcej miejsca i czyta ~ sześć razy więcej sprawia, że kod jest sześć razy gorszy. Dla porównania, to tak jakbyśmy użyli 'Int32.Zero' zamiast' 0'. –
nosed jednorożec: Właśnie użyłem tego samego argumentu w zeszłym tygodniu! –