File: DataAnnotations\MetadataPropertyDescriptorWrapper.cs
Project: ndp\fx\src\xsp\system\DataAnnotations\System.ComponentModel.DataAnnotations.csproj (System.ComponentModel.DataAnnotations)
#if !SILVERLIGHT
 
using System;
using System.Linq;
using System.ComponentModel;
 
namespace System.ComponentModel.DataAnnotations {
    internal class MetadataPropertyDescriptorWrapper : PropertyDescriptor {
        private PropertyDescriptor _descriptor;
        private bool _isReadOnly;
 
        public MetadataPropertyDescriptorWrapper(PropertyDescriptor descriptor, Attribute[] newAttributes)
            : base(descriptor, newAttributes) {
            _descriptor = descriptor;
            var readOnlyAttribute = newAttributes.OfType<ReadOnlyAttribute>().FirstOrDefault();
            _isReadOnly = (readOnlyAttribute != null ? readOnlyAttribute.IsReadOnly : false);
        }
 
        public override void AddValueChanged(object component, EventHandler handler) { _descriptor.AddValueChanged(component, handler); }
 
        public override bool CanResetValue(object component) { return _descriptor.CanResetValue(component); }
 
        public override Type ComponentType { get { return _descriptor.ComponentType; } }
 
        public override object GetValue(object component) { return _descriptor.GetValue(component); }
 
        public override bool IsReadOnly {
            get {
                // Dev10 Bug 594083
                // It's not enough to call the wrapped _descriptor because it does not know anything about
                // new attributes passed into the constructor of this class.
                return _isReadOnly || _descriptor.IsReadOnly;
            }
        }
 
        public override Type PropertyType { get { return _descriptor.PropertyType; } }
 
        public override void RemoveValueChanged(object component, EventHandler handler) { _descriptor.RemoveValueChanged(component, handler); }
 
        public override void ResetValue(object component) { _descriptor.ResetValue(component); }
 
        public override void SetValue(object component, object value) { _descriptor.SetValue(component, value); }
 
        public override bool ShouldSerializeValue(object component) { return _descriptor.ShouldSerializeValue(component); }
 
        public override bool SupportsChangeEvents { get { return _descriptor.SupportsChangeEvents; } }
    }
}
#endif