Проверьте диапазон параметров в типах generi c - PullRequest
1 голос
/ 06 марта 2020

Есть ли способ сделать что-то вроде "string.Compare ()", но для обобщенных c типов. Я хочу проверить диапазон значений некоторых свойств.
Вот что я делаю в качестве обходного пути, но это довольно уродливо:

public class SomeClass<T>
{

    public T MinValue { get; set; }
    public T MaxValue { get; set; }

    private T _value;
    public T Value
    {
        get { return _value; }
        set
        {
            _value = value;

            // Restrict range to Min/Max
            if (Comparer<T>.Default.Compare(MaxValue, value) < 0)
                _value = MaxValue;
            if (Comparer<T>.Default.Compare(MinValue, value) > 0)
                _value = MinValue;
        }
    }
}

1 Ответ

1 голос
/ 06 марта 2020

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

public class Program
    {
        public static void Main(string[] args)
        {
            System.Console.WriteLine("Hello World!");

            TestObject testObject = new TestObject(15);

            TestObject testObject2 = new TestObject(9);

            TestObject testObject3 = new TestObject(31);

            System.Console.ReadLine();
        }
    }

public class TestObject
    {
        [ValidateIntMin(Min = 10)]
        [ValidateIntMax(30)]
        public int SomeInt { get; set; }

        public TestObject(int value)
        {
            SomeInt = value;

            if (!Validator.Validate(this))
            {
                System.Console.WriteLine("Invalid Value assigned: " + value);
            }
            else
            {
                System.Console.WriteLine("" + SomeInt + " was a valid value");
            }

        }
    }

public class ValidateIntMax : Attribute
    {
        public int Max { get; set; }

        public ValidateIntMax(int MaxValue)
        {
            Max = MaxValue;
        }
    }

public class ValidateIntMin: Attribute
    {
        public int Min { get; set; }
    }

public static class Validator
    {
        public static bool Validate<T>(T input) {
            var attrType = typeof(T);
            var properties = attrType.GetProperties();
            bool isValid = true;
            foreach (PropertyInfo propertyInfo in properties)
            {
                var customerMaxValueInt = propertyInfo.GetCustomAttributes(typeof(ValidateIntMax), false).FirstOrDefault();
                var customerMinValueInt = propertyInfo.GetCustomAttributes(typeof(ValidateIntMin), false).FirstOrDefault();

                if (customerMaxValueInt != null)
                {
                    if (propertyInfo.PropertyType == typeof(int))
                    {
                        var currentPropertyInfoBeingTested = (int)propertyInfo.GetValue(input);
                        var currentMaxValueToVerifyAgainst = ((ValidateIntMax)customerMaxValueInt).Max;

                        if (currentPropertyInfoBeingTested > currentMaxValueToVerifyAgainst)
                        {
                            isValid = false;
                        }
                    }
                }

                if (customerMinValueInt != null)
                {
                    if (propertyInfo.PropertyType == typeof(int))
                    {
                        var currentPropertyInfoBeingTested = (int)propertyInfo.GetValue(input);
                        var currentMaxValueToVerifyAgainst = ((ValidateIntMin)customerMinValueInt).Min;

                        if (currentPropertyInfoBeingTested < currentMaxValueToVerifyAgainst)
                        {
                            isValid = false;
                        }
                    }
                }

            }
            return isValid;
        }
    }

Должно дать вывод:

Hello World!

15 was a valid value

Invalid Value assigned: 9

Invalid Value assigned: 31

Конечно, вы можете добавить проверку для разных типов и т. Д. c. Это просто чтобы показать совершенно индивидуальный способ настройки ваших атрибутов.

Однако я рекомендую вам прочитать атрибут ValidationAttribute, чтобы узнать, не можете ли вы использовать реализованную функциональность.

Но это всего лишь кусок По C.

...