在VB.net中使用对象初始化器的键

时间:2015-04-15 19:47:22

标签: vb.net

我正在使用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版本不能编译? 谢谢。 戈登

2 个答案:

答案 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"}