/ /VB.netのオブジェクトイニシャライザーのキーを使用-vb.net

VB.netのオブジェクト初期化子にキーを使用する-vb.net

PayPal NetSDKのコードを使用しています(nugetで利用可能)。 C#で書かれたサンプルからそれを持ち上げました。次に、(Telerikの)自動トランスレータを使用してVB.netに変換しました。トランスレータは完全ではありません。処理できないコードは次のとおりです。

 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"
},

}
};

このコードフラグメントを見て、私はそれを考えましたは名前付きクラスのオブジェクト初期化子でしたが、「payoutitem」という名前のクラスを検索しても見つかりません。右クリックして定義に移動すると、から再構築されていることがわかります。 「メタデータ」で、次で始まるコードが表示されます。

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

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

そこで、先に進んでVBへのトランスレータを使用します。そこでも、「payoutItem」はメタデータとしてのみ存在すると言われています。さらに、結果をコンパイルしようとするとエラーが発生します。これは次のとおりです。

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" _
} _
} _
}

どうやらここに最初の「キー」があると問題が発生し、それを削除すると他のコンパイルの問題が発生します。

クラスに名前(PayoutItem)があるのに、なぜMetaDataとしてのみ存在するのか、そして次に、VBバージョンがコンパイルされないのはなぜか説明できますか? ありがとう。 ゴードン

回答:

回答№1は1

のメタデータが表示されている理由 PayoutItem それはあなたがC#ライブラリだからですVB.NETからの参照。何らかの理由でそのコードを翻訳しようとする必要はありません。私はそれがコンパイルに使用されるとはまったく信じていません、そして私は主にIntellisenseで使用されることを期待しています。

PayoutItem 確かに、PayPalSDKアセンブリに存在する実際の.NETクラスです。そうでない場合は、 List<PayoutItem> 有効な構文でさえありません。

最初のコードブロックを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"
}
})

ここで取り上げるべき重要なことは、VB.NETが With インラインオブジェクト初期化子と前のピリオドを含むキーワード(.)プロパティ名の前。C#はそうではありません。

また、soapboxeryを少しお待ちください私があなたが抱えている問題は、C#からVB.NETへのコンバーターを盲目的に使用することがひどい考えである理由です。 2つの言語の構文の違いと、変換しようとしているコードで何が起こっているのかを十分に理解していることが重要です。これらのいずれかまたは両方がないと、コードの記述が不十分になったり、コードにバグが生じたりして、デバッグがはるかに困難になります。


回答№2の場合は0

Key属性を削除します。文字列属性を設定するオブジェクトの例:

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