У меня есть класс, который позволяет мне устанавливать значение с минимальными и максимальными пределами. Если эти пределы превышены, значение изменяется. До сих пор я использовал только тип данных double, но я также хочу использовать целые числа. Я надеялся, что универсальный класс даст правильное решение, но столкнулся с некоторыми проблемами ....
/// <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;
}
}
Во время установки значения T я хотел бы ограничить его типом данных. Однако приведение к правильному типу данных вызывает у меня проблемы? Если честно, я новичок в дженериках.
Кто-нибудь, у кого есть совет или лучший подход к решению этой проблемы?
1 ответ
Каждый раз, когда вы выполняете проверку определенного типа для универсального типа (т.е. 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;
}
}
}
Одна из основных целей дженериков - избежать заботы о том, какие типы вы на самом деле получаете и с которыми работаете. Ограничения помогают сузить круг вопросов, указав части типа, которые необходимы для правильной работы.
В этом случае вам нужна возможность сравнивать их, поэтому сделайте это в своем ограничении.
CompareTo
должен возвращать только отрицательное значение, если оно меньше, и положительное, если оно больше, а не 1
или -1
.
Похожие вопросы
Связанные вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.
T
значениемIComparable<T>
и используйтеCompareTo
для сравнения вместо операторов.