[c#] 사용자 지정 유효성 검사 특성을 만드는 방법?



Answers

제 예제를 보시려면 다음을보십시오.

INotifyPropertyChanged 구현하는 모델 클래스

public class ModelClass : INotifyPropertyChanged
        {
            private string destinationCity;
            public string SourceCity { get; set; }

            public ModelClass()
            {
                PropertyChanged += CustomAttribute.ThrowIfNotEquals;
            }

            [Custom("SourceCity", ErrorMessage = "the source and destination should not be equal")]
            public string DestinationCity
            {
                get
                {
                    return this.destinationCity;
                }

                set
                {
                    if (value != this.destinationCity)
                    {
                        this.destinationCity = value;
                        NotifyPropertyChanged("DestinationCity");
                    }
                }
            }

            public event PropertyChangedEventHandler PropertyChanged;

            protected virtual void NotifyPropertyChanged(string info)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(info));
                }
            }
        }

속성 클래스 는 또한 이벤트 hendler를 포함합니다.

internal sealed class CustomAttribute : Attribute
    {
        public CustomAttribute(string propertyName)
        {
            PropertyName = propertyName;
        }

        public string PropertyName { get; set; }

        public string ErrorMessage { get; set; }

        public static void ThrowIfNotEquals(object obj, PropertyChangedEventArgs eventArgs)
        {
            Type type = obj.GetType();
            var changedProperty = type.GetProperty(eventArgs.PropertyName);
            var attribute = (CustomAttribute)changedProperty
                                                 .GetCustomAttributes(typeof(CustomAttribute), false)
                                                 .FirstOrDefault();

            var valueToCompare = type.GetProperty(attribute.PropertyName).GetValue(obj, null);
            if (!valueToCompare.Equals(changedProperty.GetValue(obj, null)))
                throw new Exception("the source and destination should not be equal");
        }
    }

용법

    var test = new ModelClass();
    test.SourceCity = "1";
    // Everything is ok
    test.DestinationCity = "1";
    // throws exception
    test.DestinationCity ="2";

코드를 단순화하기 위해 유효성 검사를 생략하기로했습니다.

Question

내 속성 클래스의 값과 다른 속성 값을 비교하기 위해 사용자 지정 유효성 검사 특성을 만들려고합니다. 예를 들어, 내 모델 클래스에있다 :

...    
public string SourceCity { get; set; }
public string DestinationCity { get; set; }

그리고 이것을 다음과 같이 사용하기 위해 맞춤 속성을 만들고 싶습니다.

[Custom("SourceCity", ErrorMessage = "the source and destination should not be equal")]
public string DestinationCity { get; set; }
//this wil lcompare SourceCity with DestinationCity

어떻게 거기에 갈 수 있습니까?




Links