Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Os objetos dinâmicos expõem membros como propriedades e métodos em tempo de execução, em vez de em tempo de compilação. Isso permite que você crie objetos para trabalhar com estruturas que não correspondem a um tipo ou formato estático. Por exemplo, você pode usar um objeto dinâmico para fazer referência ao DOM (Document Object Model) HTML, que pode conter qualquer combinação de elementos e atributos de marcação HTML válidos. Como cada documento HTML é exclusivo, os membros de um documento HTML específico são determinados em tempo de execução. Um método comum para fazer referência a um atributo de um elemento HTML é passar o nome do atributo para o GetProperty método do elemento . Para fazer referência ao id atributo do elemento <div id="Div1">HTML , primeiro obtenha uma referência ao <div> elemento e, em seguida, use divElement.GetProperty("id"). Se você usar um objeto dinâmico, poderá fazer referência ao id atributo como divElement.id.
Objetos dinâmicos também fornecem acesso conveniente a linguagens dinâmicas como IronPython e IronRuby. Você pode usar um objeto dinâmico para fazer referência a um script dinâmico que é interpretado em tempo de execução.
Você faz referência a um objeto dinâmico usando a associação tardia. Você especifica o tipo de um objeto de ligação tardia como Object. Para obter mais informações, consulte [Vinculação antecipada e tardia.
Você pode criar objetos dinâmicos personalizados usando as classes no System.Dynamic namespace. Por exemplo, pode criar um ExpandoObject e especificar os membros desse objeto em tempo de execução. Você também pode criar seu próprio tipo que herda a DynamicObject classe. Pode-se então substituir os membros da classe DynamicObject para fornecer funcionalidade dinâmica em tempo de execução.
Este artigo contém duas instruções passo a passo independentes:
Crie um objeto personalizado que exponha dinamicamente o conteúdo de um arquivo de texto como propriedades de um objeto.
Crie um projeto que use uma
IronPythonbiblioteca.
Você pode fazer um destes ou ambos, e se você fizer ambos, a ordem não importa.
Pré-requisitos
- Visual Studio 2019 versão 16.9 ou posterior com a carga de trabalho de desenvolvimento .NET para desktop instalada. O SDK do .NET 5 é instalado automaticamente quando você seleciona essa carga de trabalho.
Nota
Seu computador pode mostrar nomes ou locais diferentes para alguns dos elementos da interface do usuário do Visual Studio nas instruções a seguir. A edição do Visual Studio que você tem e as configurações que você usa determinam esses elementos. Para obter mais informações, consulte Personalizando o IDE.
- Para o segundo passo a passo, instale o IronPython para .NET. Vá para a página de download para obter a versão mais recente.
Criar um objeto dinâmico personalizado
O primeiro passo a passo define um objeto dinâmico personalizado que pesquisa o conteúdo de um arquivo de texto. Uma propriedade dinâmica especifica o texto a ser pesquisado. Por exemplo, se o código de chamada especificar dynamicFile.Sample, a classe dinâmica retornará uma lista genérica de cadeias de caracteres que contém todas as linhas do arquivo que começam com "Sample". A pesquisa não diferencia maiúsculas de minúsculas. A classe dinâmica também suporta dois argumentos opcionais. O primeiro argumento é um valor enum da opção de pesquisa que especifica que a classe dinâmica deve procurar correspondências no início da linha, no final da linha ou em qualquer lugar da linha. O segundo argumento especifica que a classe dinâmica deve cortar espaços à esquerda e à direita de cada linha antes de pesquisar. Por exemplo, se o código de chamada especificar dynamicFile.Sample(StringSearchOption.Contains), a classe dinâmica procurará "Exemplo" em qualquer lugar de uma linha. Se o código de chamada especificar dynamicFile.Sample(StringSearchOption.StartsWith, false), a classe dinâmica procurará "Exemplo" no início de cada linha e não removerá espaços à esquerda e à direita. O comportamento padrão da classe dinâmica é procurar uma correspondência no início de cada linha e remover espaços à esquerda e à direita.
Para criar uma classe dinâmica personalizada
Inicie o Visual Studio.
Selecione Criar um novo projeto.
Na caixa de diálogo Criar um novo projeto, selecione Visual Basic, selecione Aplicativo de Console e selecione Avançar.
Na caixa de diálogo Configurar seu novo projeto, digite
DynamicSampleo nome do projeto e selecione Avançar.Na caixa de diálogo Informações adicionais, selecione .NET 5.0 (Atual) para o Target Framework e, em seguida, selecione Criar.
O novo projeto é criado.
No Explorador de Soluções, clique com o botão direito no projeto DynamicSample e selecione Adicionar>Classe. Na caixa Nome, digite
ReadOnlyFilee selecione Adicionar.É adicionado um novo arquivo que contém a classe ReadOnlyFile.
Na parte superior do arquivo ReadOnlyFile.cs ou ReadOnlyFile.vb , adicione o código a seguir para importar os System.IO namespaces e System.Dynamic .
Imports System.IO Imports System.DynamicO objeto dinâmico personalizado usa um enum para determinar os critérios de pesquisa. Antes da instrução class, adicione a seguinte definição de enum.
Public Enum StringSearchOption StartsWith Contains EndsWith End EnumAtualize a instrução class para herdar a
DynamicObjectclasse, conforme mostrado no exemplo de código a seguir.Public Class ReadOnlyFile Inherits DynamicObjectAdicione o seguinte código à
ReadOnlyFileclasse para definir um campo privado para o caminho do arquivo e um construtor para aReadOnlyFileclasse.' Store the path to the file and the initial line count value. Private p_filePath As String ' Public constructor. Verify that file exists and store the path in ' the private variable. Public Sub New(ByVal filePath As String) If Not File.Exists(filePath) Then Throw New Exception("File path does not exist.") End If p_filePath = filePath End SubAdicione o seguinte método
GetPropertyValueà classeReadOnlyFile. OGetPropertyValuemétodo toma, como entrada, critérios de pesquisa e retorna as linhas de um arquivo de texto que correspondem a esse critério de pesquisa. Os métodos dinâmicos fornecidos pelaReadOnlyFileclasse chamam oGetPropertyValuemétodo para recuperar seus respetivos resultados.Public Function GetPropertyValue(ByVal propertyName As String, Optional ByVal StringSearchOption As StringSearchOption = StringSearchOption.StartsWith, Optional ByVal trimSpaces As Boolean = True) As List(Of String) Dim sr As StreamReader = Nothing Dim results As New List(Of String) Dim line = "" Dim testLine = "" Try sr = New StreamReader(p_filePath) While Not sr.EndOfStream line = sr.ReadLine() ' Perform a case-insensitive search by using the specified search options. testLine = UCase(line) If trimSpaces Then testLine = Trim(testLine) Select Case StringSearchOption Case StringSearchOption.StartsWith If testLine.StartsWith(UCase(propertyName)) Then results.Add(line) Case StringSearchOption.Contains If testLine.Contains(UCase(propertyName)) Then results.Add(line) Case StringSearchOption.EndsWith If testLine.EndsWith(UCase(propertyName)) Then results.Add(line) End Select End While Catch ' Trap any exception that occurs in reading the file and return Nothing. results = Nothing Finally If sr IsNot Nothing Then sr.Close() End Try Return results End FunctionApós o método
GetPropertyValue, adicione o código a seguir para sobrepor o método TryGetMember da classe DynamicObject. O TryGetMember método é chamado quando um membro de uma classe dinâmica é solicitado e nenhum argumento é especificado. Obinderargumento contém informações sobre o membro referenciado e fazresultreferência ao resultado retornado para o membro especificado. O TryGetMember método retorna um valor booleano que retornatruese o membro solicitado existir, caso contrário, ele retornafalse.' Implement the TryGetMember method of the DynamicObject class for dynamic member calls. Public Overrides Function TryGetMember(ByVal binder As GetMemberBinder, ByRef result As Object) As Boolean result = GetPropertyValue(binder.Name) Return If(result Is Nothing, False, True) End FunctionApós o método
TryGetMember, adicione o código a seguir para sobrescrever o método TryInvokeMember da classe DynamicObject. O TryInvokeMember método é chamado quando um membro de uma classe dinâmica é solicitado com argumentos. Obinderargumento contém informações sobre o membro referenciado e fazresultreferência ao resultado retornado para o membro especificado. Oargsargumento contém uma matriz dos argumentos que são passados para o membro. O TryInvokeMember método retorna um valor booleano que retornatruese o membro solicitado existir, caso contrário, ele retornafalse.A versão personalizada do
TryInvokeMembermétodo espera que o primeiro argumento seja um valor doStringSearchOptionenum que você definiu em uma etapa anterior. OTryInvokeMembermétodo espera que o segundo argumento seja um valor booleano. Se um ou ambos os argumentos forem valores válidos, eles serão passados para oGetPropertyValuemétodo para recuperar os resultados.' Implement the TryInvokeMember method of the DynamicObject class for ' dynamic member calls that have arguments. Public Overrides Function TryInvokeMember(ByVal binder As InvokeMemberBinder, ByVal args() As Object, ByRef result As Object) As Boolean Dim StringSearchOption As StringSearchOption = StringSearchOption.StartsWith Dim trimSpaces = True Try If args.Length > 0 Then StringSearchOption = CType(args(0), StringSearchOption) Catch Throw New ArgumentException("StringSearchOption argument must be a StringSearchOption enum value.") End Try Try If args.Length > 1 Then trimSpaces = CType(args(1), Boolean) Catch Throw New ArgumentException("trimSpaces argument must be a Boolean value.") End Try result = GetPropertyValue(binder.Name, StringSearchOption, trimSpaces) Return If(result Is Nothing, False, True) End FunctionGuarde e feche o ficheiro.
Para criar um arquivo de texto de exemplo
No Explorador de Soluções, clique com o botão direito no projeto DynamicSample e selecione Adicionar>Novo Item. No painel Modelos Instalados, selecione Geral, e, em seguida, selecione o modelo Arquivo de Texto. Deixe o nome padrão de TextFile1.txt na caixa Nome e clique em Adicionar. Um novo arquivo de texto é adicionado ao projeto.
Copie o seguinte texto para o ficheiro TextFile1.txt .
List of customers and suppliers Supplier: Lucerne Publishing (https://www.lucernepublishing.com/) Customer: Preston, Chris Customer: Hines, Patrick Customer: Cameron, Maria Supplier: Graphic Design Institute (https://www.graphicdesigninstitute.com/) Supplier: Fabrikam, Inc. (https://www.fabrikam.com/) Customer: Seubert, Roxanne Supplier: Proseware, Inc. (http://www.proseware.com/) Customer: Adolphi, Stephan Customer: Koch, PaulGuarde e feche o ficheiro.
Para criar um aplicativo de exemplo que usa o objeto dinâmico personalizado
No Gerenciador de Soluções, clique duas vezes no arquivo Program.vb .
Adicione o seguinte código ao
Mainprocedimento para criar uma instância daReadOnlyFileclasse para o arquivo TextFile1.txt . O código utiliza a vinculação tardia para invocar membros dinâmicos e recuperar linhas de texto que contêm a sequência de caracteres "Cliente".Dim rFile As Object = New ReadOnlyFile("..\..\..\TextFile1.txt") For Each line In rFile.Customer Console.WriteLine(line) Next Console.WriteLine("----------------------------") For Each line In rFile.Customer(StringSearchOption.Contains, True) Console.WriteLine(line) NextSalve o arquivo e pressione Ctrl+F5 para criar e executar o aplicativo.
Chamar uma biblioteca de linguagem dinâmica
O passo a passo a seguir cria um projeto que acessa uma biblioteca escrita na linguagem dinâmica IronPython.
Para criar uma classe dinâmica personalizada
No Visual Studio, selecione Arquivo>Novo>Projeto.
Na caixa de diálogo Criar um novo projeto, selecione Visual Basic, selecione Aplicativo de Console e selecione Avançar.
Na caixa de diálogo Configurar seu novo projeto, digite
DynamicIronPythonSampleo nome do projeto e selecione Avançar.Na caixa de diálogo Informações adicionais, selecione .NET 5.0 (Atual) para o Target Framework e, em seguida, selecione Criar.
O novo projeto é criado.
Instale o pacote NuGet do IronPython .
Edite o arquivo Program.vb .
Na parte superior do arquivo, adicione o código a seguir para importar os namespaces
Microsoft.Scripting.HostingeIronPython.Hostingdas bibliotecas IronPython e o namespaceSystem.Linq.Imports Microsoft.Scripting.Hosting Imports IronPython.Hosting Imports System.LinqNo método Main, adicione o código a seguir para criar um novo
Microsoft.Scripting.Hosting.ScriptRuntimeobjeto para hospedar as bibliotecas IronPython. OScriptRuntimeobjeto carrega o módulo de biblioteca IronPython random.py.' Set the current directory to the IronPython libraries. System.IO.Directory.SetCurrentDirectory( Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles) & "\IronPython 2.7\Lib") ' Create an instance of the random.py IronPython library. Console.WriteLine("Loading random.py") Dim py = Python.CreateRuntime() Dim random As Object = py.UseFile("random.py") Console.WriteLine("random.py loaded.")Após o código para carregar o módulo random.py, adicione o código a seguir para criar uma matriz de inteiros. A matriz é passada para o
shufflemétodo do módulo random.py, que classifica aleatoriamente os valores na matriz.' Initialize an enumerable set of integers. Dim items = Enumerable.Range(1, 7).ToArray() ' Randomly shuffle the array of integers by using IronPython. For i = 0 To 4 random.shuffle(items) For Each item In items Console.WriteLine(item) Next Console.WriteLine("-------------------") NextSalve o arquivo e pressione Ctrl+F5 para criar e executar o aplicativo.