2009-10-29 3 views
0

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

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; } 

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

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

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

+0

Почему без отражения? Вы можете добавить атрибуты к заданным свойствам и в сочетании с перечислить отражение на них. – Amirshk

+0

Я согласен с тем, что Am-reflection является «медленным», но это действительно реально возникает, когда вы создаете или копируете сотни/тысячи объектов. – JustLoren

ответ

2

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

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

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

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

0

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

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

0

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

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 для легкого копирования из ваших параметров.

Смежные вопросы