Comparteix a través de


InstanceDescriptor Clase

Definición

Proporciona la información necesaria para crear una instancia de un objeto. Esta clase no puede heredarse.

public ref class InstanceDescriptor sealed
public sealed class InstanceDescriptor
type InstanceDescriptor = class
Public NotInheritable Class InstanceDescriptor
Herencia
InstanceDescriptor

Ejemplos

En el ejemplo de código siguiente se muestra cómo usar un convertidor de tipos que participa en la generación de código mediante el uso de descriptores de instancia.

#using <system.dll>
#using <system.drawing.dll>

using namespace System;
using namespace System::ComponentModel;
using namespace System::ComponentModel::Design::Serialization;
using namespace System::Drawing;
using namespace System::Globalization;
using namespace System::Collections;
using namespace System::Reflection;

/*   This sample shows how to support code generation for a custom type of object 
         using a type converter and InstanceDescriptor objects.

         To use this code, copy it to a file and add the file to a project. Then add
         a component to the project and declare a Triangle field and a public property 
         with accessors for the Triangle field on the component.

         The Triangle property will be persisted using code generation.
    */
ref class TriangleConverter;

[TypeConverter(TriangleConverter::typeid)]
public ref class Triangle
{
private:

   // Triangle members
   Point P1;
   Point P2;
   Point P3;

public:

   property Point Point1 
   {
      Point get()
      {
         return P1;
      }

      void set( Point value )
      {
         P1 = value;
      }
   }

   property Point Point2 
   {
      Point get()
      {
         return P2;
      }

      void set( Point value )
      {
         P2 = value;
      }
   }

   property Point Point3 
   {
      Point get()
      {
         return P3;
      }

      void set( Point value )
      {
         P3 = value;
      }

   }
   Triangle( Point point1, Point point2, Point point3 )
   {
      P1 = point1;
      P2 = point2;
      P3 = point3;
   }


   /* A TypeConverter for the Triangle object.  Note that you can make it internal,
      private, or any scope you want and the designers will still be able to use
      it through the TypeDescriptor object.  This type converter provides the
      capability to convert to an InstanceDescriptor.  This object can be used by 
      the .NET Framework to generate source code that creates an instance of a 
      Triangle object. */
   [System::Security::Permissions::PermissionSet(System::Security::
      Permissions::SecurityAction::Demand, Name = "FullTrust")]
   ref class TriangleConverter: public TypeConverter
   {
   public:

      /* This method overrides CanConvertTo from TypeConverter. This is called when someone
            wants to convert an instance of Triangle to another type.  Here,
            only conversion to an InstanceDescriptor is supported. */
      virtual bool CanConvertTo( ITypeDescriptorContext^ context, Type^ destinationType ) override
      {
         if ( destinationType == InstanceDescriptor::typeid )
         {
            return true;
         }

         
         // Always call the base to see if it can perform the conversion.
         return TypeConverter::CanConvertTo( context, destinationType );
      }

      /* This code performs the actual conversion from a Triangle to an InstanceDescriptor. */
      virtual Object^ ConvertTo( ITypeDescriptorContext^ context, CultureInfo^ culture, Object^ value, Type^ destinationType ) override
      {
         if ( destinationType == InstanceDescriptor::typeid )
         {
            array<Type^>^type1 = {Point::typeid,Point::typeid,Point::typeid};
            ConstructorInfo^ ci = Triangle::typeid->GetConstructor( type1 );
            Triangle^ t = safe_cast<Triangle^>(value);
            array<Object^>^obj1 = {t->Point1,t->Point2,t->Point3};
            return gcnew InstanceDescriptor( ci,safe_cast<ICollection^>(obj1) );
         }

         // Always call base, even if you can't convert.
         return TypeConverter::ConvertTo( context, culture, value, destinationType );
      }
   };
};

public ref class TestComponent: public System::ComponentModel::Component
{
private:
   Triangle^ myTriangle;

public:
   TestComponent()
   {
      myTriangle = gcnew Triangle( Point(5,5),Point(10,10),Point(1,8) );
   }

   property Triangle^ MyTriangle 
   {
      Triangle^ get()
      {
         return myTriangle;
      }

      void set( Triangle^ value )
      {
         myTriangle = value;
      }
   }
};
namespace Microsoft.Samples.InstanceDescriptorSample
{
    using System;
    using System.ComponentModel;
    using System.ComponentModel.Design.Serialization;
    using System.Drawing;
    using System.Globalization;
    using System.Reflection;

    //  This sample shows how to support code generation for a custom type 
    //  of object using a type converter and InstanceDescriptor objects.

    //  To use this code, copy it to a file and add the file to a project. 
    //  Then add a component to the project and declare a Triangle field and 
    //  a public property with accessors for the Triangle field on the component.

    //  The Triangle property will be persisted using code generation.

    [TypeConverter(typeof(Triangle.TriangleConverter))]
    public class Triangle
    {
        // Triangle members.
        Point P1;
        Point P2;
        Point P3;

        public Point Point1 {
            get {
                return P1;
            }
            set {
                P1 = value;
            }
        }
        public Point Point2 {
            get 
            {
                return P2;
            }
            set 
            {
                P2 = value;
            }
        }
        public Point Point3 {
            get 
            {
                return P3;
            }
            set 
            {
                P3 = value;
            }
        }

        public Triangle(Point point1,Point point2,Point point3) {
            P1 = point1;
            P2 = point2;
            P3 = point3;
        }

        // A TypeConverter for the Triangle object.  Note that you can make it internal,
        //  private, or any scope you want and the designers will still be able to use
        //  it through the TypeDescriptor object.  This type converter provides the
        //  capability to convert to an InstanceDescriptor.  This object can be used by 
    //  the .NET Framework to generate source code that creates an instance of a 
    //  Triangle object.
        internal class TriangleConverter : TypeConverter
        {
            // This method overrides CanConvertTo from TypeConverter. This is called when someone
            //  wants to convert an instance of Triangle to another type.  Here,
            //  only conversion to an InstanceDescriptor is supported.
            public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
            {
                if (destinationType == typeof(InstanceDescriptor))
                {
                    return true;
                }

                // Always call the base to see if it can perform the conversion.
                return base.CanConvertTo(context, destinationType);
            }

            // This code performs the actual conversion from a Triangle to an InstanceDescriptor.
            public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
            {
                if (destinationType == typeof(InstanceDescriptor))
                {
                    ConstructorInfo ci = typeof(Triangle).GetConstructor(new Type[]{typeof(Point),
                                                    typeof(Point),typeof(Point)});
                    Triangle t = (Triangle) value;
                    return new InstanceDescriptor(ci,new object[]{t.Point1,t.Point2,t.Point3});
                }

                // Always call base, even if you can't convert.
                return base.ConvertTo(context, culture, value, destinationType);
            }
        }
    }

    public class TestComponent : System.ComponentModel.Component 
    {
        Triangle myTriangle;

        public TestComponent() {
            myTriangle = new Triangle(
                new Point(5,5),
                new Point(10,10),
                new Point(1,8)
                );
        }

        public Triangle MyTriangle {
            get {
                return myTriangle;
            }
            set {
                myTriangle = value;
            }
        }
    }
}
Imports System.ComponentModel
Imports System.ComponentModel.Design.Serialization
Imports System.Drawing
Imports System.Globalization
Imports System.Reflection
Namespace Microsoft.Samples.InstanceDescriptorSample

   '  This sample shows how to support code generation for a custom type 
   '  of object using a type converter and InstanceDescriptor objects.
   '
   '  To use this code, copy it to a file and add the file to a project.  
   '  Then add a component to the project and declare a Triangle field and 
   '  a public property with accessors for the Triangle field on the component.
   '
   '  The Triangle property will be persisted using code generation.

   <TypeConverter(GetType(Triangle.TriangleConverter))> _
   Public Class Triangle
      ' Triangle members.
      Private P1 As Point
      Private P2 As Point
      Private P3 As Point

      Public Property Point1() As Point
         Get
            Return P1
         End Get
         Set(ByVal Value As Point)
            P1 = Value
         End Set
      End Property

      Public Property Point2() As Point
         Get
            Return P2
         End Get
         Set(ByVal Value As Point)
            P2 = Value
         End Set
      End Property

      Public Property Point3() As Point
         Get
            Return P3
         End Get
         Set(ByVal Value As Point)
            P3 = Value
         End Set
      End Property

      Public Sub New(ByVal point1 As Point, ByVal point2 As Point, ByVal point3 As Point)
         P1 = point1
         P2 = point2
         P3 = point3
      End Sub

      ' A TypeConverter for the Triangle object.  Note that you can make it internal,
      '  private, or any scope you want and the designers will still be able to use
      '  it through the TypeDescriptor object.  This type converter provides the
      '  capability to convert to an InstanceDescriptor.  This object can be used by 
      '  the .NET Framework to generate source code that creates an instance of a 
      '  Triangle object.

      Friend Class TriangleConverter
         Inherits TypeConverter

         ' This method overrides CanConvertTo from TypeConverter.  This is called when someone
         '  wants to convert an instance of Triangle to another type.  Here,
         '  only coversition to an InstanceDescriptor is supported.
         Public Overloads Overrides Function CanConvertTo(ByVal context As ITypeDescriptorContext, ByVal destinationType As Type) As Boolean
            If destinationType Is GetType(InstanceDescriptor) Then
               Return True
            End If

            ' Always call the base to see if it can perform the conversion.
            Return MyBase.CanConvertTo(context, destinationType)
         End Function

         ' This code performs the actual conversion from a Triangle to an InstanceDescriptor.
         Public Overloads Overrides Function ConvertTo(ByVal context As ITypeDescriptorContext, ByVal culture As CultureInfo, ByVal value As Object, ByVal destinationType As Type) As Object
            If destinationType Is GetType(InstanceDescriptor) Then
               Dim ci As ConstructorInfo = GetType(Triangle).GetConstructor(New Type() {GetType(Point), GetType(Point), GetType(Point)})
               Dim t As Triangle = CType(value, Triangle)
               Return New InstanceDescriptor(ci, New Object() {t.Point1, t.Point2, t.Point3})
            End If

            ' Always call base, even if you can't convert.
            Return MyBase.ConvertTo(context, culture, value, destinationType)
         End Function 
      End Class 
   End Class 

   Public Class TestComponent
      Inherits System.ComponentModel.Component
      Private myTriangleProp As Triangle

      Public Sub New()
         myTriangleProp = New Triangle(New Point(5, 5), _
                                    New Point(10, 10), New Point(1, 8))
      End Sub

      Public Property MyTriangle() As Triangle
         Get
            Return myTriangleProp
         End Get
         Set(ByVal Value As Triangle)
            myTriangleProp = Value
         End Set
      End Property

   End Class

End Namespace

Comentarios

InstanceDescriptor puede almacenar información que describe una instancia de un objeto . Esta información se puede usar para crear una instancia del objeto .

Algunos serializadores personalizados usan InstanceDescriptor para representar objetos serializables. Varios métodos de un TypeDescriptor uso InstanceDescriptor para representar o crear instancias de objetos.

Proporciona InstanceDescriptor los siguientes miembros:

  • Propiedad MemberInfo que describe este objeto.

  • Propiedad Arguments que consta de los argumentos del constructor que se pueden usar para crear instancias de este objeto.

  • Propiedad booleana IsComplete que indica si el objeto está completamente representado por la información actual.

  • Método Invoke que se puede usar para crear una instancia del objeto representado.

Constructores

InstanceDescriptor(MemberInfo, ICollection)

Inicializa una nueva instancia de la clase InstanceDescriptor con la información sobre el miembro y los argumentos especificados.

InstanceDescriptor(MemberInfo, ICollection, Boolean)

Inicializa una nueva instancia de la clase InstanceDescriptor con la información sobre el miembro y los argumentos especificados, y el valor que indica si la información especificada describe la instancia por completo.

Propiedades

Arguments

Obtiene la colección de argumentos que se pueden utilizar para reconstruir una instancia del objeto que representar este descriptor de instancias.

IsComplete

Obtiene un valor que indica si el contenido de InstanceDescriptor identifica la instancia por completo.

MemberInfo

Obtiene información sobre el miembro en la que se describe la instancia a la que está asociada este descriptor.

Métodos

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.

(Heredado de Object)
GetHashCode()

Sirve como la función hash predeterminada.

(Heredado de Object)
GetType()

Obtiene el Type de la instancia actual.

(Heredado de Object)
Invoke()

Invoca a este descriptor de instancias y devuelve el objeto que describe el descriptor.

MemberwiseClone()

Crea una copia superficial del Object actual.

(Heredado de Object)
ToString()

Devuelve una cadena que representa el objeto actual.

(Heredado de Object)

Se aplica a

Consulte también