Jorge Paulino

Visual Basic em Português, MVP

Recent Posts

Tags



 
Administr. da Comunidade
Portugal-a-Programar


Membro da Comunidade
Experts-Exchange


Twitter
Artigos no CodeProject
Artigos no CodeProject 

Email Notifications

Archives

VS2010 RC1: Dynamic Support

O Visual Studio 2010 introduz suporte para utilização de objectos de linguagens dinâmicas, como IronPython ou IronRuby, e a criação de objecto dinâmicos, dentro da própria linguagem (VB ou C#). Isto torna possível a inclusão de métodos dinâmicos em linguagens estáticas, como são o VB.NET ou C#, através da Dynamic Language Runtime (DLR).

 

No caso do Visual Basic, isto permite outra forma, que não usando o tipo Object, de se ligar a objecto dinâmicos em latebind, ou seja, sem que o compilador tente interpretar o código e dê erro, sendo o código interpretado em modo de execução(run-time). Mais informação e vantagens sobre ambos os métodos: Early and Late Binding

Desta forma podemos em alguns casos, com a devida manipulação é claro, utilizar um sintaxe mais agradável, ou seja, não fazer:

        Dim reader As SqlClient.SqlDataReader = command.ExecuteReader()
        Me.txtNome.Text = reader.Item("nome")
        Me.txtMorada.Text = reader.Item("morada")
        Me.txtTelefone.Text = reader.Item("telefone")

Mas sim algo mais simples (uma vez que em ambos os casos não temos intellisense):

        Dim reader As Object = New DynamicCommand(command)
        Me.txtNome.Text = reader.nome
        Me.txtMorada.Text = reader.morada
        Me.txtTelefone.Text = reader.telefone


Isto consegue-se utilizando a classe DynamicObject(), do namespace System.Dynamic, permitindo a criação de objectos dinâmicos. De uma forma geral, podemos criar uma nova classe, que herda as propriedades e métodos do DynamicObject(), e através dos métodos TryGetMember() e TrySetMember() podemos identificar se estamos a definir uma propriedade ou a verificar o valor de uma propriedade. Existem mais métodos disponíveis, mas para o seguinte exemplo, iremos apenas utilizar estes dois.

Este pequeno exemplo irá guardar uma propriedade e depois verificar o seu valor. Bastante simples apenas para se entender o funcionamento geral.

Definição da classe dinâmica:

Public Class DynamicObjectTest
  Inherits DynamicObject

  Private m_dictionary As New Dictionary(Of String, Object)


  ''' <summary>
  ''' Verifica no Dictionary o valor guardado
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public Overrides Function TryGetMember(
                  ByVal binder As GetMemberBinder,
                  ByRef result As Object) As Boolean

    result = m_dictionary.Item(binder.Name.ToLower)
    Return True

  End Function

  ''' <summary>
  ''' Adiciona o nome e o valor no Dictionary
  ''' </summary>
  ''' <returns></returns>
  ''' <remarks></remarks>
  Public Overrides Function TrySetMember(
                  ByVal binder As System.Dynamic.SetMemberBinder,
                  ByVal value As Object) As Boolean

    m_dictionary.Add(binder.Name.ToLower, value)
    Return True
  End Function

End Class

Depois, criando uma nova instância e adicionado alguns valores:

    ' Cria uma nova instância da classe DynamicObjectTest
    Dim myDynamicObject As Object = New DynamicObjectTest()

    ' Adiciona uma nova label (com algumas definições)
    myDynamicObject.CustomObject = New Label() With
              {
               .Text = "Teste",
               .Name = "lblTeste",
               .Location = New Point(10, 10)
              }

    ' Adiciona uma mensagem
    myDynamicObject.Msg = "Dynamic Object Test"

Finalmente, a verificação e utilização dos valores guardados:

    ' Adiciona ao Form a label
    Me.Controls.Add(myDynamicObject.CustomObject)

    ' Define como texto do Form a mensagem guardada
    Me.Text = myDynamicObject.Msg


Uma funcionalidade que promete, que para além de permitir utilizar linguagens dinâmicas no VB.NET ou no C#, o que poderá trazer grandes vantagens, permite ainda criar objectos dinâmicos que podem ser utilizados na própria linguagem (onde aqui poderá ter menos utilização), ou mesmo em linguagens externas (desde que tenham suporte DLR)

Leave a Comment

(requerido) 

(requerido) 

(opcional)

 

(requerido) 

If you can't read this number refresh your screen
Enter the numbers above: