Управление сервером ASP.NET: как преобразовать строку времени разработки в тип объекта (TypeConverter?) - PullRequest
1 голос
/ 21 августа 2009

Так что, надеюсь, это глупый вопрос (на него легко ответить).

Я пытаюсь создать составной серверный элемент управления, который инкапсулирует TextBox, некоторые валидаторы и другие элементы, в зависимости от требуемого типа поля.

Мой элемент управления имеет значение «Тип данных», которое позволяет мне определить, что отображать. Например, если DataType имеет значение «Date», я отображаю AjaxControlToolkit.CalendarExtender и т. Д.

Мое общее свойство "Value" является объектом и будет возвращать то, что требует свойство DataType, поэтому в приведенном выше примере значение будет иметь тип Date.

Итак, вот моя проблема, мне нужно преобразовать входящее свойство Value во все, что DataType требует во время выполнения.

Как вы можете видеть, я пытался написать TypeConverter для него, но, похоже, он не работает, я получаю эту ошибку во время компиляции:

Невозможно сгенерировать код для значения типа 'System.Object'. Эта ошибка произошла при попытке создать значение свойства для значения.

Любая помощь будет высоко ценится!

Вот как я пытаюсь вызвать свой контроль:

<custom:SomeTextControl ID="dateFoo" runat="server" DataType="Date" Value="08/11/2009" />

Вот мой класс:

Public Class SomeTextControl
Inherits Control

  Private _Value as Object
  <Bindable(True), TypeConverter(GetType(ObjectConverter))> _
  Public Property Value() As Object
    Get
        Return _Value
    End Get
    Set(ByVal value As Object)
        _Value = value
    End Set
  End Property
End Class

Public Class ObjectConverter
    Inherits TypeConverter

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Dim o As Object
        o = value
        Return o
    End Function

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then
            Return True
        End If
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function
End Class

1 Ответ

1 голос
/ 21 августа 2009

Так что, кажется, я сам понял это ... так много для чрезмерно задаваемых вопросов.

В любом случае, кажется, я забыл проверить, является ли destinationType InstanceDescriptor (duh). Как только я понял, что потребовалось еще несколько минут, чтобы понять, что мне нужно установить свой объект в строку (или что-то еще, но я выбираю строку, так как я все равно собираюсь выплюнуть ее обратно в TextBox ), поскольку Объект не принимает конструктор.

Дайте мне знать, если у вас есть идеи получше.

Итак, я закончил с этим TypeConverter:

Friend Class ObjectConverter
    Inherits TypeConverter

    Public Overrides Function ConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object) As Object
        Return value
    End Function

    Public Overrides Function CanConvertFrom(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal sourceType As System.Type) As Boolean
        If sourceType Is GetType(String) Then
            Return True
        ElseIf sourceType Is GetType(InstanceDescriptor) Then
            Return True
        End If
        Return MyBase.CanConvertFrom(context, sourceType)
    End Function

    Public Overrides Function CanConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal destinationType As System.Type) As Boolean
        If destinationType Is GetType(String) Then
            Return True
        ElseIf destinationType Is GetType(InstanceDescriptor) Then
            Return True
        End If
        Return MyBase.CanConvertTo(context, destinationType)
    End Function

    Public Overrides Function ConvertTo(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal culture As System.Globalization.CultureInfo, ByVal value As Object, ByVal destinationType As System.Type) As Object
        If destinationType Is GetType(InstanceDescriptor) Then
            Dim constructor As ConstructorInfo = GetType(String).GetConstructor(New Type() {GetType(Char())})
            Dim instance As New InstanceDescriptor(constructor, New Object() {CType(value.ToString, Char())})
            Return instance
        End If

        Return MyBase.ConvertTo(context, culture, value, destinationType)
    End Function
End Class
...