我被分配到将一个 VB.NET 项目转换为 C#,但我被卡住了。我正在使用一个名为 RsiOPCAuto 的类,但我认为我不必深入了解它的工作原理。让我们继续处理我的问题。
所以基本上我所做的是使用这段代码从我的类中获取一个对象:
public partial class FrmPartialMain : Form
{
RsiOPCAuto.OPCServer oOpcServer;
public FrmPartialMain()
{
InitializeComponent();
object RsiOPCAuto;
object oOPCList;
oOpcServer = new RsiOPCAuto.OPCServer();
oOPCList = oOpcServer.GetOPCServers();
到目前为止,还不错。通过添加 watch ,我可以看到 oOPCList 现在具有值 {string[1..4]}。
现在我想把这四个字符串放到一个组合框中。我用一个简单的 for 循环来做到这一点:
for (int i = 0; i <= oOPCList.Length; i++)
{
cboServer.Items.Add(oOPCList[i]);
}
编辑:从头开始,将其更改为更好的 foreach 循环。
即使此对象现在用作字符串数组,但 oOPCList.Length 和 (oOPCList[i]) 都会出错:
.长度: 错误 1“object”不包含“Length”的定义,并且找不到接受“object”类型的第一个参数的扩展方法“Length”(是否缺少 using 指令或程序集引用?)
oOPCList[i]: 错误 2 无法将带 [] 的索引应用于“对象”类型的表达式
我敢打赌这是最简单的事情,但我就是看不到它,非常感谢您的帮助,如果您还有其他需要知道的,请务必询问 :-)
附言。可能值得一提的是,我尝试了一些不同的方法将对象转换为字符串数组,但我不断收到错误消息,告诉我无法将 system.string[*] 转换为 system.string[]。
这是我正在转换的 VB.NET 代码:
Friend Class frmPartialMain
Inherits System.Windows.Forms.Form
Dim oOpcServer As RsiOPCAuto.OPCServer
Private Sub frmPartialMain_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
Dim RsiOPCAuto As Object
Dim oOPCList() As Object
Dim i As Integer
oOpcServer = New RsiOPCAuto.OPCServer
oOPCList = oOpcServer.GetOPCServers
For i = LBound(oOPCList) To UBound(oOPCList)
cboServer.Items.Add(oOPCList(i))
Next i
最佳答案
你需要转换GetOPCServers
的返回值到object
首先,然后到 Array
,因为此方法返回 dynamic
类型。您不能直接转换为 string[]
因为 C# 不支持不基于 0 的强类型数组。施法后需要调用Cast<string>
获得一个强类型的可枚举对象,您可以对其进行迭代:
IEnumerable<string> oOPCList;
oOpcServer = new RsiOPCAuto.OPCServer();
oOPCList = ((Array)(object)oOpcServer.GetOPCServers()).Cast<string>();
此外,您最好使用 foreach
循环,因为它更具可读性:
foreach(var item in oOPCList)
cboServer.Items.Add(item);
怪投先到object
, 然后到 Array
, 然后到 IEnumerable<string>
通过Cast<string>
由于以下原因需要:
GetOPCServers
返回 dynamic
类型。尝试以任何方式访问该动态实例 - 即使通过调用 GetType
触发 InvalidCastException
.因此,首先需要转换为object
。所以它不再是动态类型。之后,我们可以将其转换为 Array
。 ,这是 C# 中处理非零基数组的唯一受支持方式。但是Array
不是强类型的,所以我们将调用附加到 Cast<string>
获得强类型枚举。
关于C#:对象到字符串数组。 [*] 到 [] 错误(了解 VB.NET 和 C# 会有所帮助),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9940013/