将VB.NET转换为C#时出错:obj'是'变量',但用作'方法'

时间:2012-12-28 09:53:00

标签: c# .net vb.net

我尝试将vb.net代码转换为c#,如下所示 的 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<ComponentItem>)((Result)obj("ComponentInformation")).Output)
                  {
                      lstComp.Add(new Component
                      {
                          ComponentId = comp.BusinessUnitID,
                          ComponentName = comp.BusinessUnitName
                      });
                  }
}

转换代码后我收到错误 obj'是'变量'但是像'方法'一样使用如何重新发送此错误?

3 个答案:

答案 0 :(得分:4)

obj可能是一个数组,在C#中你必须通过方括号[]访问其成员。所以它应该是:

obj["ComponentInformation"]

编辑:(礼貌@Groo

你必须改变你的行:

object obj = srv.GetData(criteria);

您应该指定方法返回的类型,而不是object。或者,您可以使用var来隐式输入变量。

var obj = srv.GetData(criteria);

答案 1 :(得分:1)

object更改为var

var obj = srv.GetData(criteria);

而且......

For Each Comp As ComponentItem In DirectCast(DirectCast(_obj["ComponentInformation"], Result).Output, List(Of ComponentItem))

答案 2 :(得分:0)

在v 4.0之前,引入dynamic的C#不支持后期绑定,就像VB一样:

_obj("ComponentInformation")

所以,你不能只为object类型的变量:

写这样的东西
_obj["ComponentInformation"]

没有dynamic或反射API的C#(例如,如果您使用COM对象)。

您必须声明适当类型的变量(具有索引器),或使用dynamic,或使用反射API。