Более универсальным, безопасным и повторно используемым решением вашей проблемы может быть реализация универсального, «параметризованного» класса свойств, например:
// 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
}
}
Затем вы можете реализовать любое количество свойств в вашем открытом классе, чтобы клиенты могли устанавливать / получать свойства с помощью индекса, дескриптора, ключа безопасности или чего-либо подобного, например:
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; }
}
}
Наконец, клиентский код будет обращаться к «параметризованным» свойствам вашего публичного класса, например:
ParameterizedProperties parmProperties = new ParameterizedProperties();
parmProperties.PublicIntProp[1] = 100;
parmProperties.PublicStringProp[1] = "whatever";
int ival = parmProperties.PublicIntProp[1];
string strVal = parmProperties.PublicStringProp[1];
Конечно, это кажется странным, но это определенно помогает. Кроме того, с точки зрения клиентского кода это совсем не странно - это просто и интуитивно понятно, и действует как реальные свойства. Он не нарушает никаких правил C # и не является несовместимым с другими языками, управляемыми .NET. И с точки зрения реализатора класса, создание многократно используемого, универсального, «параметризованного» класса шаблона свойств делает кодирование компонентов относительно легким, как показано здесь.
ПРИМЕЧАНИЕ. Вы всегда можете переопределить универсальный класс свойств для обеспечения настраиваемой обработки, такой как индексированный поиск, доступ к контролируемому безопасностью свойству или все, что вам нужно.
Ура!
Марк Джонс