You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetworkInterface抽象类实例化报CS0144错误,求解决方法

问题:NetworkInterface实例化报错CS0144

我编写了一个程序,可列出硬盘驱动器(HDD)和网络接口,效果如图所示:
Network interfaces list

点击硬盘名称时,文本框会显示驱动器类型,此功能运行正常。但处理网络接口时出现异常,提示错误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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 06:40:29