PropertyDescriptor 类 
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
提供类上属性的抽象。
public ref class PropertyDescriptor abstract : System::ComponentModel::MemberDescriptorpublic abstract class PropertyDescriptor : System.ComponentModel.MemberDescriptor[System.Runtime.InteropServices.ComVisible(true)]
public abstract class PropertyDescriptor : System.ComponentModel.MemberDescriptortype PropertyDescriptor = class
    inherit MemberDescriptor[<System.Runtime.InteropServices.ComVisible(true)>]
type PropertyDescriptor = class
    inherit MemberDescriptorPublic MustInherit Class PropertyDescriptor
Inherits MemberDescriptor- 继承
- 派生
- 属性
示例
以下代码示例基于 PropertyDescriptorCollection 类中的示例生成。 它打印文本框中按钮文本的信息(类别、说明、显示名称)。 它假定在窗体上实例化了 button1 和 textbox1。
// Creates a new collection and assign it the properties for button1.
PropertyDescriptorCollection^ properties = TypeDescriptor::GetProperties( button1 );
// Sets an PropertyDescriptor to the specific property.
System::ComponentModel::PropertyDescriptor^ myProperty = properties->Find( "Text", false );
// Prints the property and the property description.
textBox1->Text = String::Concat( myProperty->DisplayName, "\n" );
textBox1->Text = String::Concat( textBox1->Text, myProperty->Description, "\n" );
textBox1->Text = String::Concat( textBox1->Text, myProperty->Category, "\n" );
// Creates a new collection and assign it the properties for button1.
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(button1);
// Sets an PropertyDescriptor to the specific property.
System.ComponentModel.PropertyDescriptor myProperty = properties.Find("Text", false);
// Prints the property and the property description.
textBox1.Text = myProperty.DisplayName + '\n';
textBox1.Text += myProperty.Description + '\n';
textBox1.Text += myProperty.Category + '\n';
' Creates a new collection and assign it the properties for button1.
Dim properties As PropertyDescriptorCollection = TypeDescriptor.GetProperties(Button1)
' Sets an PropertyDescriptor to the specific property.
Dim myProperty As PropertyDescriptor = properties.Find("Text", False)
' Prints the property and the property description.
TextBox1.Text += myProperty.DisplayName & Microsoft.VisualBasic.ControlChars.Cr
TextBox1.Text += myProperty.Description & Microsoft.VisualBasic.ControlChars.Cr
TextBox1.Text += myProperty.Category & Microsoft.VisualBasic.ControlChars.Cr
下面的代码示例演示如何实现一个自定义属性描述符,该描述符围绕属性提供只读包装器。 自定义设计器中使用 SerializeReadOnlyPropertyDescriptor 为控件的 Size 属性提供只读属性描述符。
using System;
using System.Collections;
using System.ComponentModel;
using System.Text;
namespace ReadOnlyPropertyDescriptorTest
{
    // The SerializeReadOnlyPropertyDescriptor shows how to implement a 
    // custom property descriptor. It provides a read-only wrapper 
    // around the specified PropertyDescriptor. 
    internal sealed class SerializeReadOnlyPropertyDescriptor : PropertyDescriptor
    {
        private PropertyDescriptor _pd = null;
        public SerializeReadOnlyPropertyDescriptor(PropertyDescriptor pd)
            : base(pd)
        {
            this._pd = pd;
        }
        public override AttributeCollection Attributes
        {
            get
            {
                return( AppendAttributeCollection(
                    this._pd.Attributes, 
                    ReadOnlyAttribute.Yes) );
            }
        }
        protected override void FillAttributes(IList attributeList)
        {
            attributeList.Add(ReadOnlyAttribute.Yes);
        }
        public override Type ComponentType
        {
            get
            {
                return this._pd.ComponentType;
            }
        }
        // The type converter for this property.
        // A translator can overwrite with its own converter.
        public override TypeConverter Converter
        {
            get
            {
                return this._pd.Converter;
            }
        }
        // Returns the property editor 
        // A translator can overwrite with its own editor.
        public override object GetEditor(Type editorBaseType)
        {
            return this._pd.GetEditor(editorBaseType);
        }
        // Specifies the property is read only.
        public override bool IsReadOnly
        {
            get
            {
                return true;
            }
        }
        public override Type PropertyType
        {
            get
            {
                return this._pd.PropertyType;
            }
        }
        public override bool CanResetValue(object component)
        {
            return this._pd.CanResetValue(component);
        }
        public override object GetValue(object component)
        {
            return this._pd.GetValue(component);
        }
        public override void ResetValue(object component)
        {
            this._pd.ResetValue(component);
        }
        public override void SetValue(object component, object val)
        {
            this._pd.SetValue(component, val);
        }
        // Determines whether a value should be serialized.
        public override bool ShouldSerializeValue(object component)
        {
            bool result = this._pd.ShouldSerializeValue(component);
            if (!result)
            {
                DefaultValueAttribute dva = (DefaultValueAttribute)_pd.Attributes[typeof(DefaultValueAttribute)];
                if (dva != null)
                {
                    result = !Object.Equals(this._pd.GetValue(component), dva.Value);
                }
                else
                {
                    result = true;
                }
            }
            return result;
        }
        // The following Utility methods create a new AttributeCollection
        // by appending the specified attributes to an existing collection.
        static public AttributeCollection AppendAttributeCollection(
            AttributeCollection existing, 
            params Attribute[] newAttrs)
        {
            return new AttributeCollection(AppendAttributes(existing, newAttrs));
        }
        static public Attribute[] AppendAttributes(
            AttributeCollection existing, 
            params Attribute[] newAttrs)
        {
            if (existing == null)
            {
                throw new ArgumentNullException(nameof(existing));
            }
            newAttrs ??= new Attribute[0];
            Attribute[] attributes;
            Attribute[] newArray = new Attribute[existing.Count + newAttrs.Length];
            int actualCount = existing.Count;
            existing.CopyTo(newArray, 0);
            for (int idx = 0; idx < newAttrs.Length; idx++)
            {
                if (newAttrs[idx] == null)
                {
                    throw new ArgumentNullException("newAttrs");
                }
                // Check if this attribute is already in the existing
                // array.  If it is, replace it.
                bool match = false;
                for (int existingIdx = 0; existingIdx < existing.Count; existingIdx++)
                {
                    if (newArray[existingIdx].TypeId.Equals(newAttrs[idx].TypeId))
                    {
                        match = true;
                        newArray[existingIdx] = newAttrs[idx];
                        break;
                    }
                }
                if (!match)
                {
                    newArray[actualCount++] = newAttrs[idx];
                }
            }
            // If some attributes were collapsed, create a new array.
            if (actualCount < newArray.Length)
            {
                attributes = new Attribute[actualCount];
                Array.Copy(newArray, 0, attributes, 0, actualCount);
            }
            else
            {
                attributes = newArray;
            }
            return attributes;
        }
    }
}
Imports System.Collections
Imports System.ComponentModel
Imports System.Text
' The SerializeReadOnlyPropertyDescriptor shows how to implement a 
' custom property descriptor. It provides a read-only wrapper 
' around the specified PropertyDescriptor. 
Friend NotInheritable Class SerializeReadOnlyPropertyDescriptor
    Inherits PropertyDescriptor
    Private _pd As PropertyDescriptor = Nothing
    Public Sub New(ByVal pd As PropertyDescriptor)
        MyBase.New(pd)
        Me._pd = pd
    End Sub
    Public Overrides ReadOnly Property Attributes() As AttributeCollection
        Get
            Return AppendAttributeCollection(Me._pd.Attributes, ReadOnlyAttribute.Yes)
        End Get
    End Property
    Protected Overrides Sub FillAttributes(ByVal attributeList As IList)
        attributeList.Add(ReadOnlyAttribute.Yes)
    End Sub
    Public Overrides ReadOnly Property ComponentType() As Type
        Get
            Return Me._pd.ComponentType
        End Get
    End Property
    ' The type converter for this property.
    ' A translator can overwrite with its own converter.
    Public Overrides ReadOnly Property Converter() As TypeConverter
        Get
            Return Me._pd.Converter
        End Get
    End Property
    ' Returns the property editor 
    ' A translator can overwrite with its own editor.
    Public Overrides Function GetEditor(ByVal editorBaseType As Type) As Object
        Return Me._pd.GetEditor(editorBaseType)
    End Function
    ' Specifies the property is read only.
    Public Overrides ReadOnly Property IsReadOnly() As Boolean
        Get
            Return True
        End Get
    End Property
    Public Overrides ReadOnly Property PropertyType() As Type
        Get
            Return Me._pd.PropertyType
        End Get
    End Property
    Public Overrides Function CanResetValue(ByVal component As Object) As Boolean
        Return Me._pd.CanResetValue(component)
    End Function
    Public Overrides Function GetValue(ByVal component As Object) As Object
        Return Me._pd.GetValue(component)
    End Function
    Public Overrides Sub ResetValue(ByVal component As Object)
        Me._pd.ResetValue(component)
    End Sub
    Public Overrides Sub SetValue(ByVal component As Object, ByVal val As Object)
        Me._pd.SetValue(component, val)
    End Sub
    ' Determines whether a value should be serialized.
    Public Overrides Function ShouldSerializeValue(ByVal component As Object) As Boolean
        Dim result As Boolean = Me._pd.ShouldSerializeValue(component)
        If Not result Then
            Dim dva As DefaultValueAttribute = _
                CType(_pd.Attributes(GetType(DefaultValueAttribute)), DefaultValueAttribute)
            If Not (dva Is Nothing) Then
                result = Not [Object].Equals(Me._pd.GetValue(component), dva.Value)
            Else
                result = True
            End If
        End If
        Return result
    End Function
    ' The following Utility methods create a new AttributeCollection
    ' by appending the specified attributes to an existing collection.
    Public Shared Function AppendAttributeCollection( _
        ByVal existing As AttributeCollection, _
        ByVal ParamArray newAttrs() As Attribute) As AttributeCollection
        Return New AttributeCollection(AppendAttributes(existing, newAttrs))
    End Function
    Public Shared Function AppendAttributes( _
        ByVal existing As AttributeCollection, _
        ByVal ParamArray newAttrs() As Attribute) As Attribute()
        If existing Is Nothing Then
            Throw New ArgumentNullException("existing")
        End If
        If newAttrs Is Nothing Then
            newAttrs = New Attribute(-1) {}
        End If
        Dim attributes() As Attribute
        Dim newArray(existing.Count + newAttrs.Length) As Attribute
        Dim actualCount As Integer = existing.Count
        existing.CopyTo(newArray, 0)
        Dim idx As Integer
        For idx = 0 To newAttrs.Length
            If newAttrs(idx) Is Nothing Then
                Throw New ArgumentNullException("newAttrs")
            End If
            ' Check if this attribute is already in the existing
            ' array.  If it is, replace it.
            Dim match As Boolean = False
            Dim existingIdx As Integer
            For existingIdx = 0 To existing.Count - 1
                If newArray(existingIdx).TypeId.Equals(newAttrs(idx).TypeId) Then
                    match = True
                    newArray(existingIdx) = newAttrs(idx)
                    Exit For
                End If
            Next existingIdx
            If Not match Then
                actualCount += 1
                newArray(actualCount) = newAttrs(idx)
            End If
        Next idx
        ' If some attributes were collapsed, create a new array.
        If actualCount < newArray.Length Then
            attributes = New Attribute(actualCount) {}
            Array.Copy(newArray, 0, attributes, 0, actualCount)
        Else
            attributes = newArray
        End If
        Return attributes
    End Function
End Class
以下代码示例演示如何在自定义设计器中使用 SerializeReadOnlyPropertyDescriptor。
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms.Design;
namespace ReadOnlyPropertyDescriptorTest
{
    class DemoControlDesigner : ControlDesigner
    {
        // The PostFilterProperties method replaces the control's 
        // Size property with a read-only Size property by using 
        // the SerializeReadOnlyPropertyDescriptor class.
        protected override void PostFilterProperties(IDictionary properties)
        {
            if (properties.Contains("Size"))
            {
                PropertyDescriptor original = properties["Size"] as PropertyDescriptor;
                SerializeReadOnlyPropertyDescriptor readOnlyDescriptor = 
                    new SerializeReadOnlyPropertyDescriptor(original);
                properties["Size"] = readOnlyDescriptor;
            }
            base.PostFilterProperties(properties);
        }
    }
}
Imports System.Collections
Imports System.ComponentModel
Imports System.Text
Imports System.Windows.Forms.Design
Class DemoControlDesigner
    Inherits ControlDesigner
    
    ' The PostFilterProperties method replaces the control's 
    ' Size property with a read-only Size property by using 
    ' the SerializeReadOnlyPropertyDescriptor class.
    Protected Overrides Sub PostFilterProperties(ByVal properties As IDictionary) 
        If properties.Contains("Size") Then
            Dim original As PropertyDescriptor = properties("Size")
            
            Dim readOnlyDescriptor As New SerializeReadOnlyPropertyDescriptor(original)
            
            properties("Size") = readOnlyDescriptor
        End If
        
        MyBase.PostFilterProperties(properties)
    
    End Sub
End Class
using System.ComponentModel;
using System.Windows.Forms;
namespace ReadOnlyPropertyDescriptorTest
{
    [Designer(typeof(DemoControlDesigner))]
    public class DemoControl : Control
    {
        public DemoControl()
        {
        }
    }
}
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Text
Imports System.Windows.Forms
Imports System.Windows.Forms.Design
<Designer(GetType(DemoControlDesigner))>  _
Public Class DemoControl
    Inherits Control
    
    Public Sub New() 
    
    End Sub
End Class
注解
属性的说明包括名称、其属性、属性关联的组件类以及属性的类型。
PropertyDescriptor 提供以下属性和方法:
- Converter 包含此属性的 TypeConverter。 
- IsLocalizable 指示是否应本地化此属性。 
- GetEditor 返回指定类型的编辑器。 
              PropertyDescriptor 还提供以下 abstract 属性和方法:
- ComponentType 包含此属性绑定到的组件类型。 
- IsReadOnly 指示此属性是否为只读。 
- PropertyType 获取属性的类型。 
- CanResetValue 指示重置组件是否更改组件的值。 
- GetValue 返回组件上属性的当前值。 
- ResetValue 重置组件的此属性的值。 
- SetValue 将组件的值设置为其他值。 
- ShouldSerializeValue 指示是否需要保留此属性的值。 
通常,abstract 成员是通过反射实现的。 有关反射的详细信息,请参阅 反射中的主题。
构造函数
| PropertyDescriptor(MemberDescriptor) | 使用指定 MemberDescriptor中的名称和属性初始化 PropertyDescriptor 类的新实例。 | 
| PropertyDescriptor(MemberDescriptor, Attribute[]) | 使用指定 MemberDescriptor 中的名称以及 MemberDescriptor 和 Attribute 数组中的属性初始化 PropertyDescriptor 类的新实例。 | 
| PropertyDescriptor(String, Attribute[]) | 使用指定的名称和属性初始化 PropertyDescriptor 类的新实例。 | 
属性
| AttributeArray | 获取或设置属性数组。(继承自 MemberDescriptor) | 
| Attributes | 获取此成员的属性集合。(继承自 MemberDescriptor) | 
| Category | 获取成员所属的类别的名称,如 CategoryAttribute中指定的。(继承自 MemberDescriptor) | 
| ComponentType | 在派生类中重写时,获取此属性绑定到的组件的类型。 | 
| Converter | 获取此属性的类型转换器。 | 
| ConverterFromRegisteredType | 获取此属性的类型转换器。 | 
| Description | 获取成员的说明,如 DescriptionAttribute中指定的。(继承自 MemberDescriptor) | 
| DesignTimeOnly | 获取是否仅在设计时设置此成员,如 DesignOnlyAttribute中指定的。(继承自 MemberDescriptor) | 
| DisplayName | 获取可在窗口中显示的名称,例如“属性”窗口。(继承自 MemberDescriptor) | 
| IsBrowsable | 获取一个值,该值指示成员是否可浏览,如 BrowsableAttribute中指定的值。(继承自 MemberDescriptor) | 
| IsLocalizable | 获取一个值,该值指示是否应本地化此属性,如 LocalizableAttribute中指定的。 | 
| IsReadOnly | 在派生类中重写时,获取一个值,该值指示此属性是否为只读。 | 
| Name | 获取成员的名称。(继承自 MemberDescriptor) | 
| NameHashCode | 获取成员名称的哈希代码,如 GetHashCode()中指定的。(继承自 MemberDescriptor) | 
| PropertyType | 在派生类中重写时,获取属性的类型。 | 
| SerializationVisibility | 获取一个值,该值指示是否应按照 DesignerSerializationVisibilityAttribute中指定的方式序列化此属性。 | 
| SupportsChangeEvents | 获取一个值,该值指示此属性的值更改通知是否可能源自属性描述符外部。 |