Может ли быть хорошей идеей поместить свойства в словари? - PullRequest
0 голосов
/ 29 октября 2009

Предположим, у меня есть класс с несколькими свойствами, которые соответствуют пользовательским параметрам, таким как:

bool StepUpHedge { get; set; }
bool PullOnJump { get; set; }
bool PullOnCross { get; set; }
double MaxStockSpread { get; set; }
double MaxHedgeSpread { get; set; }

(Это всего лишь примеры, а не реальный код, и в любом случае, что они имеют в виду, не важно.)

Теперь, скажем, на самом деле существуют десятки или даже сотни этих пользовательских параметров. Сохранение / загрузка и (что лучше всего) копирование всех или некоторых из одного экземпляра класса в другой может быть довольно громоздким.

Очевидно, я не хочу просто создавать один Dictionary<Parameter, object>, чтобы хранить их все (безопасность типа? Бокс? Что это?), Но было бы было бы неплохо иметь возможность перечислять более их (без размышления), что заставляет меня задуматься ...

Что если бы я сделал несколько словарей:

public enum BoolParameter { /*...*/ }
public enum DoubleParameter { /*...*/ }
public enum IntParameter { /*...*/ }
Dictionary<BoolParameter, bool> BoolParameters { get; set; }
Dictionary<DoubleParameter, double> DoubleParameters { get; set; }
Dictionary<IntParameter, int> IntParameters { get; set; }

Я знаю, что это кажется очень ненадежным, и есть более понятные способы работы со свойствами в general (например, путем подкласса их в логические группы); но то, что я не могу , кажется, обернулось вокруг меня, - это как еще обеспечить полную желаемую функциональность легко поддерживаемым способом.

Требуемая функциональность: возможность отображать все пользовательские параметры для выбранного экземпляра, выбирать свойства для копирования и копировать значения только этих выбранных свойств из одного экземпляра в другой. Используя перечислимый интерфейс для этих свойств, это становится довольно просто сделать - и добавить новый параметр так же просто, как добавить его в словарь. В противном случае, без использования отражения, мне трудно его увидеть.

Если подумать, может мне стоит использовать строго типизированный DataSet для всего этого ...

Ответы [ 3 ]

2 голосов
/ 29 октября 2009

На самом деле я никогда не делал этого, но я думаю, что вы можете перебирать свойства класса с помощью метода Reflection GetProperties ().

, который дает вам массив объектов PropertyInfo для работы.

http://msdn.microsoft.com/en-us/library/system.reflection.propertyinfo.aspx

Редактировать: только что заметил бит "без отражения". почему без размышлений? если у вас нет жестких ограничений, это, вероятно, лучше, чем сложное решение из нескольких словарей.

0 голосов
/ 29 октября 2009

Если я полностью понимаю, что вы имеете в виду, я думаю, что вместо этого лучше использовать набор определений параметров. Примерно так:

public class ParameterInfo : IClonabe
{
    public string ParameterName { get; set; }
    public Type ParameterType { get; set; }
    public object Value { get; set; }
}

И еще один класс:

public class UserParameters : IClonabe
{
    public IEnumerable<ParameterInfo> Parameters { get; set; }
}

использование этой модели приемлемо, поскольку параметры не являются постоянными. Вы можете реализовать интерфейс IClonable для простого копирования из ваших параметров.

0 голосов
/ 29 октября 2009

Если существует действительно сотни этих свойств, я думаю, что в любом случае нецелесообразно реализовывать каждое из них.

Предполагая, что эти свойства не имеют ничего конкретного, я на самом деле также рассмотрел бы более общий способ справиться с этим, и то, что вы предлагаете, не так уж плохо, даже если оно нетрадиционно. Но также нетрадиционно иметь сотни свойств.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...