NetworkInterface抽象类实例化报CS0144错误,求解决方法
问题:NetworkInterface实例化报错CS0144
我编写了一个程序,可列出硬盘驱动器(HDD)和网络接口,效果如图所示:
点击硬盘名称时,文本框会显示驱动器类型,此功能运行正常。但处理网络接口时出现异常,提示错误CS0144:无法创建抽象类型或接口“NetworkInterface”的实例。
正常运行的硬盘相关代码
private void button2_Click(object sender, EventArgs e) { listBox1.Items.Clear(); textBox1.Text = ""; DriveInfo[] Drives = DriveInfo.GetDrives(); foreach (DriveInfo drv in Drives) { listBox1.Items.Add(drv.Name); } } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { String strDrive = (string)listBox1.SelectedItem; DriveInfo drive = new DriveInfo(strDrive); textBox1.Text = drive.DriveType.ToString(); }
运行异常的网络接口相关代码
private void button3_Click(object sender, EventArgs e) { listBox2.Items.Clear(); textBox2.Text = ""; NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface adapter in adapters) { listBox2.Items.Add(adapter.Name); } } private void listBox2_SelectedIndexChanged(object sender, EventArgs e) { String strInterface = (string)listBox2.SelectedItem; NetworkInterface adapter = new NetworkInterface(strInterface); textBox2.Text = adapter.Description.ToString(); }
错误行:NetworkInterface adapter = new NetworkInterface(strInterface);
解决方法
NetworkInterface是抽象类,不能通过new直接实例化。可以通过以下两种方式修复:
方法一:列表框直接存储NetworkInterface对象
修改加载网络接口的方法,直接将整个对象添加到列表框(列表框会自动显示对象的Name属性):
private void button3_Click(object sender, EventArgs e) { listBox2.Items.Clear(); textBox2.Text = ""; NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface adapter in adapters) { listBox2.Items.Add(adapter); } }
然后修改选中事件的处理逻辑:
private void listBox2_SelectedIndexChanged(object sender, EventArgs e) { if (listBox2.SelectedItem is NetworkInterface adapter) { textBox2.Text = adapter.Description; } }
方法二:缓存适配器集合,通过名称查找
先在类中定义一个缓存集合:
private List<NetworkInterface> _cachedAdapters = new List<NetworkInterface>();
修改加载方法,将适配器存入缓存:
private void button3_Click(object sender, EventArgs e) { listBox2.Items.Clear(); textBox2.Text = ""; _cachedAdapters.Clear(); _cachedAdapters.AddRange(NetworkInterface.GetAllNetworkInterfaces()); foreach (NetworkInterface adapter in _cachedAdapters) { listBox2.Items.Add(adapter.Name); } }
然后在选中事件中通过名称从缓存中查找对应的适配器:
private void listBox2_SelectedIndexChanged(object sender, EventArgs e) { string selectedName = listBox2.SelectedItem as string; var targetAdapter = _cachedAdapters.FirstOrDefault(adapter => adapter.Name == selectedName); if (targetAdapter != null) { textBox2.Text = targetAdapter.Description; } }
内容的提问来源于stack exchange,提问作者Dusan
相关产品推荐
相关产品推荐

