Условно для сопоставления универсальных числовых типов, допускающих значение NULL. - PullRequest
0 голосов
/ 25 октября 2011

Учитывая тип T, есть ли способ написать что-то эквивалентное

if (typeof(T).ImplementsProperty(MaxValue))
{
    return T ?? typeof(T).MaxValue;
}
else
    return T;

Обратите внимание, что мне не нужно ограничение общего типа для класса или метода, мне просто нужно условноев теле метода.T в этом случае может быть любым IComparable.Я пытаюсь упорядочить нулевые числовые типы / типы дат с нулями, встречающимися в последний раз.

Редактировать: Извините, в приведенном выше синтаксисе есть ошибка, на которую указывает Рэй.Он должен возвращать value ?? typeof(T).MaxValue, учитывая T value или что-то в этом роде.Надеюсь, это ясно.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

Мне кажется, что это работает для типов nullable, value и reference:

public T GetSelfOrMaxValue<T>(T value)
{
    var t = Nullable.GetUnderlyingType(typeof(T)) ?? typeof(T);
    var fi = t.GetField("MaxValue");
    if (fi != null && fi.IsStatic && fi.FieldType.Equals(t))
    {
        return (T)fi.GetValue(null);
    }
    return value;
}

Это то, что вы хотели?

1 голос
/ 25 октября 2011

Во-первых, проблема.Вы не можете вернуть T, который является параметром типа.Это будет эквивалентно return int, что недопустимо.

Но вы можете увидеть, есть ли у T свойство MaxValue, и вызвать его, если оно есть.Приведенный ниже код проверяет статическое свойство с именем MaxValue и вызывает его (и предполагает, что это int).

Type type = typeof (T);
var propInfo = type.GetProperty("MaxValue", BindingFlags.Static | BindingFlags.Public);
if (propInfo != null)
    return (int)propInfo.GetValue(null, null);

Я предполагаю, что вы хотите что-то вроде этого:

    public static T GetValueOrMax<T>(T value) where T:IComparable
    {
        if (value != null)
            return value;

        Type type = typeof (T);
        var propInfo = type.GetProperty("MaxValue", BindingFlags.Static | BindingFlags.Public);
        if (propInfo != null)
            return (T)propInfo.GetValue(null, null);

        return value;
    }

Ноу него будут свои проблемы, если вы передадите int, он никогда не будет нулевым и всегда будет возвращать value.Если вы передадите nullable int, то он не будет реализовывать MaxValue (на самом деле вы не можете передать nullable int, поскольку он не реализует IComparable).

A, где условие where T:class, IComparable можетбыть наиболее подходящим.

Другим вариантом было бы изменить проверку в начале на

if (value != default(T)) 
    return value

Но тогда передача 0 вернула бы MaxValue, а не 0, что может быть не тем, что вы хотите.

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