Могу я спросить: почему вам не нужны отдельные свойства? Это идиоматический способ .NET для выражения данных, связанных с объектом.
Лично, предполагая, что данные не редки, я бы сохранил свойства и использовал бы общий метод использования отражения - это сделает ваш скомпилированный код максимально быстрым:
protected T Get<T>(string name, T @default)
{
var prop = GetType().GetProperty(name);
if(prop == null) return @default;
return (T) prop.GetValue(this, null);
}
Конечно, если вам не нужны сами определяемые свойства, тогда с индексатором и поиском (например, словарем) все будет в порядке. Есть также вещи, которые вы могли бы сделать с postsharp, чтобы превратить набор свойств в пакет свойств - хотя, вероятно, это того не стоит.
Если вы хотите, чтобы свойства были доступны для привязки данных и обнаружения во время выполнения, но не могли определить их во время компиляции, тогда вам нужно взглянуть на дескрипторы динамических типов; либо ICustomTypeDescriptor
, либо TypeDescriptionProvider
- трудоемкий, но очень универсальный (дайте мне знать, если вам нужна дополнительная информация).