Ошибка Преобразование VB.NET в C #: obj 'является «переменной», но используется как «метод»,

I try to convert vb.net code to C# like below VB.NET

  Dim _obj As Object = _srv.GetData(_criteria)
            If _obj IsNot Nothing Then
                For Each Comp As ComponentItem In DirectCast(DirectCast(_obj("ComponentInformation"), Result).Output, List(Of ComponentItem))
                    _lstComp.Add(New Core.Component() With {.ComponentID = Comp.BusinessUnitID, .ComponentName = Comp.BusinessUnitName})
                Next
            End If

<Сильный> C#

   object obj = srv.GetData(criteria);
          if (obj != null)
          {
    foreach (ComponentItem comp in (List)((Result)obj("ComponentInformation")).Output)
                  {
                      lstComp.Add(new Component
                      {
                          ComponentId = comp.BusinessUnitID,
                          ComponentName = comp.BusinessUnitName
                      });
                  }
}

после преобразования кода я получил ошибку obj 'является «переменной», но используется как «метод» . Как перенести эту ошибку?

0
nl ja de

3 ответы

obj is probably an array, in C# you have to access its members via square brackets []. So it should be:

obj["ComponentInformation"]

EDIT: (courtesy @Groo)

Вы должны изменить свою линию:

object obj = srv.GetData(criteria);

Вместо object вы должны указать тип, возвращаемый методом. Или вы можете использовать var , чтобы иметь неявно типизированная переменная.

var obj = srv.GetData(criteria);
3
добавлено
Я пытаюсь это сделать, но я получил ошибку Невозможно применить индексирование с [] к выражению типа 'object'
добавлено автор JEMI, источник
Ok.Now It Resolve моя ошибка. Спасибо.
добавлено автор JEMI, источник
Замена object с помощью var в первой строке, вероятно, исправит ошибку (если только GetData не вернет объект ), и вы на самом деле нужно использовать класс с индексом).
добавлено автор Groo, источник
@JEMI, что возвращает ваш метод srv.GetData , вместо объекта вы указываете этот тип при определении obj
добавлено автор Habib, источник

Измените object на var :

var obj = srv.GetData(criteria);

А также ...

For Each Comp As ComponentItem In DirectCast(DirectCast(_obj["ComponentInformation"], Result).Output, List(Of ComponentItem))
1
добавлено
@DaveBish: Object , очевидно.
добавлено автор Dennis, источник
@Groo: посмотрите Dim _obj As Object , пожалуйста. Хотя, вы правы - это тип переменной, а не тип возвращаемого значения метода.
добавлено автор Dennis, источник
Я пытаюсь это сделать, но я получил ошибку Невозможно применить индексирование с [] к выражению типа 'object'
добавлено автор JEMI, источник
@Dennis: Почему вы это предположили? Каждый класс выводится из object в C #.
добавлено автор Groo, источник
@Dave: Я думаю, что вы смешивали некоторые синтаксисы VB.NET и C #. :)
добавлено автор Groo, источник
Почему тип srv.GetData (критерии); вернуть? возможно, измените его на: var obj = srv.GetData (критерии);
добавлено автор Dave Bish, источник

C #, до версии 4.0, где были введены dynamic s, не поддерживает позднюю привязку, например, VB:

_obj("ComponentInformation")

Таким образом, вы не можете просто написать что-то подобное для переменной типа object :

_obj["ComponentInformation"]

в C# без dynamic или API отражения (например, если вы работаете с COM-объектом).

Вам либо нужно объявить переменную соответствующего типа (с индексом), либо использовать dynamic , либо использовать API отражения.

0
добавлено
DotNetRuChat
DotNetRuChat
2 992 участник(ов)

Чат русскоязычного .NET сообщества http://dotnet.ru/ Вам могут быть интересны: @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @xamarin_russia, @microsoftstackjobs, @uwp_ru Флуд в @dotnettalks

Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

pro.net
pro.net
710 участник(ов)

Обсуждение .NET Framework и всего, что с ним связано. Правила: не флудить не по теме, уважать ваших коллег и никакой рекламы (объявления о вакансиях можно согласовать с @AlexFails). Флудилка: @dotnettalks Участник @proDOT

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot

.NET Talks: Force Push Masters
.NET Talks: Force Push Masters
490 участник(ов)

Свободный чат .NET разработчиков. Правила: t.me/dotnettalks/56823 Вам могут быть интересны: @dotnetruchat, @dotnetchat, @cilchat, @fsharp_chat, @pro_net, @dotnetgroup, @xamarin_russia, @microsoftstackjobs, @uwp_ru http://combot.org/chat/-1001128250813

.NET Chat Убежище
.NET Chat Убежище
246 участник(ов)

Чат .NET разработчиков под эгидой MSK/SPB .NET Community Group Вам могут быть интересны: @fsharp_chat, @dotnetruchat, @cilchat, @xamarin_russia, @microsoftstackjobs, @dotnetgroup Флуд в @dotnettalks

.NET CIL Chat
.NET CIL Chat
54 участник(ов)

.NET CIL (aka IL aka MSIL)