2016-02-26 3 views
0

У меня есть класс, который позволяет мне устанавливать значение с минимальными и максимальными пределами. Если эти пределы превышены, значение изменяется. До сих пор я использовал только двойной тип данных, но я также хочу использовать целые числа. Я надеялся, что общий класс даст правильное решение, но я бегу в некоторых проблем ....Ошибка распаковки общего класса

/// <summary> 
/// This method takes a default value with the min and max limits. If the value exceeds these limits it is corrected. 
/// </summary> 
public partial class GeneratorProperty<T> 
{ 
    private T _value; 

    private T Min { get; } 

    private T Max { get; } 

    /// <summary> 
    /// </summary> 
    /// <param name="defaultValue"></param> 
    /// <param name="min"></param> 
    /// <param name="max"></param> 
    public GeneratorProperty(T defaultValue, T min, T max) 
    { 
     _value = defaultValue; 
     Min = min; 
     Max = max; 
    } 

    /// <summary> 
    /// </summary> 
    public T Value 
    { 
     get { return _value; } 
     set 
     { 
      if (typeof (T) == typeof (double)) 
      { 
       var temp = (double)(object)value; 
       (double)(object)_value = temp.ConstrainDouble((double)(object)Min, (double)(object)Max); 
       //Cannot modify the result of an unboxing conversion 
      } 
      else if (typeof(T) == typeof(int)) 
      { 
       var temp = (int)(object)value; 
       (int)(object)_value = temp.ConstrainInt((int)(object)Min, (int)(object)Max); 
       //Cannot modify the result of an unboxing conversion 
      } 
     } 
    } 
} 

/// <summary> 
/// </summary> 
public static class Extention 
{ 
    /// <summary> 
    ///  The extension method Constrains a double using a min and max value. 
    /// </summary> 
    /// <param name="value">Value to test</param> 
    /// <param name="min">minimum limit</param> 
    /// <param name="max">maximum limit</param> 
    /// <returns></returns> 
    public static double ConstrainDouble(this double value, double min, double max) 
    { 
     if (value >= min && value <= max) 
      return value; 
     if (value >= max) 
      return max; 
     if (value <= min) 
      return min; 
     return 1; 
    } 

    public static double ConstrainInt(this int value, int min, int max) 
    { 
     if (value >= min && value <= max) 
      return value; 
     if (value >= max) 
      return max; 
     if (value <= min) 
      return min; 
     return 1; 
    } 
} 

Во время настройки Т Value Я хотел бы ограничить на основе типа данных. Однако приведение к правильному типу данных дает мне проблему? Честно говоря, я довольно новичок в дженериках.

Любой, у кого есть рекомендации или лучший подход к тому, как это решить?

+0

возможно * _value = (T) (объект) temp.ConstrainDouble ((double) (объект) Min, (double) (object) Max); * работает? – Gusman

+1

Возможно, вы должны просто сделать код полностью универсальным. Ограничьте 'T' на' IComparable 'и используйте' CompareTo' для сравнения вместо операторов. –

+0

Объяснение ошибки - http://stackoverflow.com/questions/17280547/why-can-i-not-modify-the-result-of-an-unboxing-conversion –

ответ

6

Каждый раз, когда вы выполняете проверку определенного типа на общий тип (т. Е. If (typeof (T) == typeof (double))), вы, вероятно, делаете что-то неправильно.

public partial class GeneratorProperty<T> where T: IComparable<T> 
{ 
    ... 
    public T Value 
    { 
     get {... } 
     set 
     { 
      if (this.Max.CompareTo(value) < 0) 
       this._value = this.Max; 
      else if (this.Min.CompareTo(value) > 0) 
       this._value = this.Min; 
      else 
       this._value = value; 
     } 
    } 
} 

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

В этом случае вы хотите сравнить их, поэтому используйте это в своем ограничении.

+1

'CompareTo' нужно вернуть отрицательное значение меньше, а положительный - больше, чем, а не '1' или' -1'. – Lee

+0

@ Lee Хороший улов, забыл об этом. –

+0

Спасибо! Сохраняет мне много кода. –

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