ITypeDescriptorContext Интерфейс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Предоставляет контекстную информацию о компоненте, например, его контейнер и дескриптор свойства.
public interface class ITypeDescriptorContext : IServiceProvider
public interface ITypeDescriptorContext : IServiceProvider
[System.Runtime.InteropServices.ComVisible(true)]
public interface ITypeDescriptorContext : IServiceProvider
type ITypeDescriptorContext = interface
interface IServiceProvider
[<System.Runtime.InteropServices.ComVisible(true)>]
type ITypeDescriptorContext = interface
interface IServiceProvider
Public Interface ITypeDescriptorContext
Implements IServiceProvider
- Производный
- Атрибуты
- Реализации
Примеры
В следующем примере кода показано, как использовать интерфейс для поддержки ITypeDescriptorContext преобразования типов.
#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
Комментарии
Интерфейс ITypeDescriptorContext предоставляет контекстные сведения о компоненте. ITypeDescriptorContext обычно используется во время разработки для предоставления сведений о контейнере времени разработки. Этот интерфейс обычно используется при преобразовании типов. Дополнительные сведения см. в разделе TypeConverter.
Примечание
При проектировании преобразователя типов не следует полагаться на наличие этого интерфейса. Если определенный интерфейс, свойство или служба необходимы, но недоступны, преобразователь типов должен возвращать null
, а не создавать исключение. Свойства этого интерфейса могут возвращаться null
в любое время, и вы должны запланировать это.
Свойства
Container |
Возвращает контейнер, представляющий это запрос TypeDescriptor. |
Instance |
Возвращает объект, связанный с этим запросом дескриптора типа. |
PropertyDescriptor |
Возвращает PropertyDescriptor, связанный с заданным элементом контекста. |
Методы
GetService(Type) |
Возвращает объект службы указанного типа. (Унаследовано от IServiceProvider) |
OnComponentChanged() |
Вызывает событие ComponentChanged. |
OnComponentChanging() |
Вызывает событие ComponentChanging. |
Методы расширения
GetKeyedService<T>(IServiceProvider, Object) |
Возвращает службу типа |
GetKeyedServices(IServiceProvider, Type, Object) |
Возвращает перечисление служб типа |
GetKeyedServices<T>(IServiceProvider, Object) |
Возвращает перечисление служб типа |
GetRequiredKeyedService(IServiceProvider, Type, Object) |
Возвращает службу типа |
GetRequiredKeyedService<T>(IServiceProvider, Object) |
Возвращает службу типа |
CreateAsyncScope(IServiceProvider) |
Создает интерфейс AsyncServiceScope, который может использоваться для разрешения служб с ограниченной областью. |
CreateScope(IServiceProvider) |
Создает интерфейс IServiceScope, который может использоваться для разрешения служб с ограниченной областью. |
GetRequiredService(IServiceProvider, Type) |
Возвращает службу типа |
GetRequiredService<T>(IServiceProvider) |
Возвращает службу типа |
GetService<T>(IServiceProvider) |
Возвращает службу типа |
GetServices(IServiceProvider, Type) |
Возвращает перечисление служб типа |
GetServices<T>(IServiceProvider) |
Возвращает перечисление служб типа |
GetFakeLogCollector(IServiceProvider) |
Возвращает объект , который собирает записи журнала, отправляемые в поддельные средства ведения журнала. |
GetFakeRedactionCollector(IServiceProvider) |
Возвращает поддельный экземпляр сборщика редактора из контейнера внедрения зависимостей. |