/ / usando a chave para inicializadores de objeto em VB.net - vb.net

usando chave para inicializadores de objeto em VB.net - vb.net

Estou usando um código do SDK do PayPal Net(disponível no nuget). Eu o tirei das amostras, que são escritas em C #. Então usei um tradutor automático (da Telerik) para convertê-lo para VB.net. O tradutor não é perfeito e aqui está um código que ele não pode manipular:

 items = new List<PayoutItem>
{
new PayoutItem
{
recipient_type = PayoutRecipientType.EMAIL,
Amount = New Currency
{
value = "0.99",
Currency = "USD"
},
receiver = "shirt-supplier-one@mail.com",
note = "Thank you.",
sender_item_id = "item_1"
},

}
};

Ao olhar para este fragmento de código, pensei queera um inicializador de objeto para uma classe nomeada, mas quando faço uma pesquisa pela classe chamada "payoutitem", não a encontro, e quando clico com o botão direito e vou para a definição, ele me diz que a está reconstruindo a partir de "metadados" e fornece um código que começa com:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;

namespace PayPal.Api
{
public class PayoutItem : PayPalSerializableObject
{
public PayoutItem();

Então, vou em frente e uso o tradutor para VB, e aí também fico sabendo que o "payoutItem" só existe como metadados. Além disso, ocorre um erro quando tento compilar o resultado, que é:

Dim payout = New Payout() With { _
key .sender_batch_header = New PayoutSenderBatchHeader() With { _
Key .sender_batch_id = "batch_" + System.Guid.NewGuid().ToString().Substring(0, 8), _
Key .email_subject = "You have a payment" _
}, _
Key .items = New List(Of PayoutItem)() From { _
New PayoutItem() With { _
Key .recipient_type = PayoutRecipientType.EMAIL, _
Key .amount = New Currency() With { _
Key .value = "0.99", _
Key .currency = "USD" _
}, _
Key .receiver = "shirt-supplier-one@mail.com", _
Key .note = "Thank you.", _
Key .sender_item_id = "item_1" _
}, _
New PayoutItem() With { _
Key .recipient_type = PayoutRecipientType.EMAIL, _
Key .amount = New Currency() With { _
Key .value = "0.90", _
Key .currency = "USD" _
}, _
Key .receiver = "shirt-supplier-two@mail.com", _
Key .note = "Thank you.", _
Key .sender_item_id = "item_2" _
}, _
New PayoutItem() With { _
Key .recipient_type = PayoutRecipientType.EMAIL, _
Key .amount = New Currency() With { _
Key .value = "2.00", _
Key .currency = "USD" _
}, _
Key .receiver = "shirt-supplier-three@mail.com", _
Key .note = "Thank you.", _
Key .sender_item_id = "item_3" _
} _
} _
}

Aparentemente, ter a primeira "chave" aqui causa problemas e, quando a removo, recebo outros problemas de compilação.

Alguém pode me explicar por que uma classe existe apenas como MetaData, embora tenha um nome (PayoutItem) e, em segundo lugar, por que a versão VB não compila? Obrigado. Gordon

Respostas:

1 para resposta № 1

O motivo pelo qual você está vendo os metadados do PayoutItem é porque é uma biblioteca C # que você éreferenciando do VB.NET. Você não precisa tentar traduzir esse código por nenhum motivo. Não acredito que seja usado para compilação e espero que seja principalmente para uso com o Intellisense.

PayoutItem é de fato uma classe .NET real que existe no assembly SDK do PayPal. Se não fosse, então List<PayoutItem> não seria uma sintaxe válida.

A maneira apropriada de converter seu primeiro bloco de código em VB.NET é

Dim items = New List(Of PayoutItem)({
New PayoutItem() With {
.recipient_type = PayoutRecipientType.EMAIL,
.Amount = New Currency() With {
.value = "0.99",
.Currency = "USD"
},
.receiver = "shirt-supplier-one@mail.com",
.note = "Thank you.",
.sender_item_id = "item_1"
}
})

Coisas importantes para tirar aqui é que o VB.NET usa o With palavra-chave com seus inicializadores de objeto embutidos e também um ponto anterior (.) antes dos nomes das propriedades, onde C # não.

Além disso, permita-me alguns momentos de palestraembora eu diga que o problema que você está tendo é exatamente por que usar cegamente conversores de C # para VB.NET é uma péssima ideia. É importante que você tenha um bom entendimento das diferenças sintáticas entre as duas linguagens e também o que exatamente está acontecendo no código que você está tentando converter. Não ter uma ou ambas essas coisas leva a um código mal escrito ou com erros que você terá muito mais dificuldade para depurar.


0 para resposta № 2

Remova o atributo Chave. Exemplo de objeto configurando os atributos da string:

Dim lookup = New Lookup() With {.Street = "7 Clayton Street",
.City = "Montgomery",
.State = "AL"}