List с generic типами
От: Someone88  
Дата: 20.07.09 09:49
Оценка:
Привет!
Нужно было сделать List для generic класса. Сделал вот так


public abstract class ValueBase
{
        public abstract Type GetValueType();
}

public class Value<T>:ValueBase 
    {

        public bool CheckValue(T value)
        {
            .....
            return res;
        }

        public override Type GetValueType()
        {
            return typeof(T);
        }
    }

//Использование
private List<ValueBase> m_Keys = new List<ValueBase>();



 public void Set(float value)
        {
                var floatValues = from suppValue in this.m_Keys 
                                  where suppValue.GetValueType().Equals(typeof(float)) 
                                  select suppValue as Value<float>;

                foreach (Value<float> suppValue in floatValues)
                {
                    if (!suppValue.CheckValue(value))
                    {
                      .......
                    }
                }

        }

Насколько это плохо?? Или может быть есть какой нибудь другой способ??
Спасибо
Re: List с generic типами
От: Ziaw Россия  
Дата: 20.07.09 10:00
Оценка:
Здравствуйте, Someone88, Вы писали:

S>Насколько это плохо?? Или может быть есть какой нибудь другой способ??


Способ для достижения чего? Чем не устроил List<object>?

var mkeys = List<object>();

var floatValues = from suppValue in this.m_Keys 
                  where suppvalue is float
                  select (float)suppValue;

                foreach (Value<float> suppValue in floatValues)
                {
                    if (!checker.CheckValue(suppValue))
                    {
                      .......
                    }
                }
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re[2]: List с generic типами
От: Someone88  
Дата: 20.07.09 10:13
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Способ для достижения чего? Чем не устроил List<object>?


Z>
Z>var mkeys = List<object>();

Z>var floatValues = from suppValue in this.m_Keys 
Z>                  where suppvalue is float
Z>                  select (float)suppValue;

Z>                foreach (Value<float> suppValue in floatValues)
Z>                {
Z>                    if (!checker.CheckValue(suppValue))
Z>                    {
Z>                      .......
Z>                    }
Z>                }

Z>

А тем, что в классе Value есть еще такое, например

public class Value<T>:ValueBase 
    {
        private T m_value;
        public T Value
        {
            get { return m_value; }
            set { m_value = value; }
        }

        private T m_low;
        public T Low
        {
            get { return m_low; } 
        }

        private T m_high;
        public T High
        {
            get { return m_high; }
        }
}

там не просто значение хранится, но еще и сопутствующие параметры
Re[3]: List с generic типами
От: Ziaw Россия  
Дата: 20.07.09 10:19
Оценка:
Здравствуйте, Someone88, Вы писали:

S>А тем, что в классе Value есть еще такое, например


S>там не просто значение хранится, но еще и сопутствующие параметры


И зачем их хранить для каждого значения?

Вы пытаетесь изобрести самоконтролирующий себя тип данных, в большинстве случаев это плохой пааттенр. При чем тут список кстати?
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re: List с generic типами
От: _FRED_ Черногория
Дата: 20.07.09 10:21
Оценка:
Здравствуйте, Someone88, Вы писали:

S>Нужно было сделать List для generic класса. Сделал вот так

S>public abstract class ValueBase
S>{
S>        public abstract Type GetValueType();
S>}


Я бы сделал интерфейс и, возможно готовый абстрактный класс, интерфейс реализующий.

S>Насколько это плохо?? Или может быть есть какой нибудь другой способ??


Не до конца описана задача. Что за CheckValue? Low? High?
Help will always be given at Hogwarts to those who ask for it.
Re[2]: List с generic типами
От: Someone88  
Дата: 20.07.09 10:44
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Я бы сделал интерфейс и, возможно готовый абстрактный класс, интерфейс реализующий.


_FR>Не до конца описана задача. Что за CheckValue? Low? High?


В общем есть набор параметров примерно такого типа

description string
low T минимальное значение для данного параметра
high T максимальное значение для данного параметра
values T[] Возможные значения параметра

Причем values содержит массив допустимых значений для value. Если список values пуст то проверяется значение на low и high.
Так вот CheckValue(T value) проверят соотвествует ли переданное значение value допустимым значениям.
value может быть одним из значений в таблице готовых значений, либо объединением, например "value1|value2" значений в таблице.
Соотвественно когда передают параметр, хочется проверять в допустимом ли он диапазоне значений.
Как то так
Re[3]: List с generic типами
От: Ziaw Россия  
Дата: 20.07.09 11:06
Оценка:
Здравствуйте, Someone88, Вы писали:

S>description string

S>low T минимальное значение для данного параметра
S>high T максимальное значение для данного параметра
S>values T[] Возможные значения параметра

S>Причем values содержит массив допустимых значений для value. Если список values пуст то проверяется значение на low и high.

S>Так вот CheckValue(T value) проверят соотвествует ли переданное значение value допустимым значениям.
S>value может быть одним из значений в таблице готовых значений, либо объединением, например "value1|value2" значений в таблице.
S>Соотвественно когда передают параметр, хочется проверять в допустимом ли он диапазоне значений.
S>Как то так

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

Вам нужны ограничения? Пожалуйста, сделайте их сколько угодно.

        public interface IConstraint<T>
        {
                        string Description { get; }
            bool CheckValue(T val);
        }

        public interface ISelectConstraint<T> : IConstraint<T>
          where T : IEquatable<T>
        {
            IEnumerable<T> GetValidValues();
        }

        public interface IRangeConstraint<T> : IConstraint<T>
            where T : IComparable<T>
        {
            T Minimum { get; }
            T Maximum { get; }
        }

                // необязательный хелпер для уверенности в том, что значение всегда валидно
        public class ConstraintedValue<T, C>
          where C : IConstraint<T>
        {
            private T val;
            private readonly C constraint;

            public T Value
            {
                get { return val;}
                set
                {
                    if (!constraint.CheckValue(value))
                        throw new ApplicationException("value");

                    val = value;
                }
            }

            public C Constraint
            {
                get { return constraint; }
            }

            public ConstraintedValue(C constraint, T val)
            {
                this.constraint = constraint;
                this.val = val;
            }
        }
... << RSDN@Home 1.2.0 alpha 4 rev. 1228>>
Re[4]: List с generic типами
От: Someone88  
Дата: 20.07.09 11:27
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Это не данные, это по сути типы или метаданные, не стоит смешивать их с данными. Непонятно кстати, почему у вас одновременно есть мин/макс и список значений, если они не применяются одновременно вообще никогда.

Насчет минимум максимум вы правы. Есть еще такое понятие как шаг значений. Тоесть например для типа int шаг может быть равен 2. Я это преобразую в список допустимых значений в духе
min < min+=2 > max. Я привел просто для примера, не думал что придется так подробно расписывать задачу А так фактически они не используются.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.