我正在使用PayPal Net SDK中的一些代码(在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"
},
}
};
在查看这段代码片段时,我认为它是一个命名类的对象初始值设定项,但是当我搜索名为&#39; payoutitem&#39;的类时,我找不到它,当我右键单击并转到定义时,它告诉我它正在重构它的元数据&#34;并给我代码开头:
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
namespace PayPal.Api
{
public class PayoutItem : PayPalSerializableObject
{
public PayoutItem();
所以我继续使用翻译到VB,在那里,我被告知&#39; payoutItem&#39;仅作为元数据存在。另外,当我尝试编译结果时,它给出了一个错误,即:
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" _
} _
} _
}
显然拥有第一个&#39; Key&#39;这会导致问题,当我删除它时,我会遇到其他编译问题。
任何人都可以向我解释为什么一个类只作为MetaData存在,即使它有一个名字(PayoutItem),其次,为什么VB版本不能编译? 谢谢。 戈登
答案 0 :(得分:1)
您看到PayoutItem
的元数据的原因是因为它是您从VB.NET引用的C#库。您无需出于任何原因尝试翻译该代码。我不相信它完全用于编译,我期望主要用于Intellisense。
PayoutItem
确实是PayPal SDK程序集中存在的真实.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转换器是一个糟糕的主意。您必须充分了解这两种语言之间的语法差异,以及您尝试转换的代码中究竟发生了什么。没有这些东西中的一个或两个会导致代码编写不好或代码有问题,因此调试时会更加困难。
答案 1 :(得分:0)
删除Key属性。对象设置字符串属性的示例:
Dim lookup = New Lookup() With {.Street = "7 Clayton Street",
.City = "Montgomery",
.State = "AL"}