1

これは、マシンネットワークインターフェイスコレクションを返したいクラスです。IEnumerableを返すことを選択しましたが、その方法がわかりません(私は新しい開発者です)。またはmaybee私のクラスを構築するためのより良い方法がありますか?

public class NetworkAdapter
{
    string _name;
    string _id;        
    string _description;
    string _ipAddress;
    string _gatewayIpAddress;
    string _speed;
    string _networkInterfaceType;
    string _macAddress;

    public IEnumerable<NetworkAdapter> getAdapterInfo()
    {
        foreach (var adapter in NetworkInterface.GetAllNetworkInterfaces())
        {
            //fetch network configuration properties
            var properties = adapter.GetIPProperties();
            foreach (var uniCast in properties.UnicastAddresses)
            {
                //ignore loop-back addresses & IPv6 internet protocol family
                if (!IPAddress.IsLoopback(uniCast.Address) 
                    && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6) 
                {
                    _name = adapter.Name;
                    _id = adapter.Id;
                    _description = adapter.Description;
                    _ipAddress = uniCast.Address.ToString();
                    _networkInterfaceType = adapter.NetworkInterfaceType.ToString();
                    _speed = adapter.Speed.ToString("#,##0");

                    _macAddress = adapter.GetPhysicalAddress().ToString();

                    var gatewayAddresses = adapter.GetIPProperties().GatewayAddresses;
                    foreach (var gatewayAddress in gatewayAddresses)
                    {
                        _gatewayIpAddress = gatewayAddress.Address.ToString();
                    }
                }
            }
        }

        yield return new NetworkAdapter att;
    }
}
4

2 に答える 2

1

linqを使用できます:

return from adapter in NetworkInterface.GetAllNetworkInterfaces()
       from uniCast in adapter.GetIPProperties().UnicastAddresses
       where !IPAddress.IsLoopback(uniCast.Address) && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6
       let lastGatewayAddress = adapter.GetIPProperties().GatewayAddresses.LastOrDefault()
       select new NetworkAdapter
       {
           _name = adapter.Name,
           _id = adapter.Id,
           _description = adapter.Description,
           _ipAddress = uniCast.Address.ToString(),
           _networkInterfaceType = adapter.NetworkInterfaceType.ToString(),
           _speed = adapter.Speed.ToString("#,##0"),
           _macAddress = adapter.GetPhysicalAddress().ToString(),
           _gatewayIpAddress = lastGatewayAddress == null ? null : lastGatewayAddress.Address.ToString()
       };

ゲートウェイアドレスで何をしようとしているのかは明確ではありません。現時点では、最後のものが必要なようですが、代わりにそれらを1つの文字列に結合することもできます。その場合、次を使用できます。

_gatewayIpAddress = string.Join(" ", adapater.GetIPProperties().GatewayAddresses.Select(a => a.Address));
于 2012-12-08T11:50:46.603 に答える
0

のオブジェクトを作成し、それをNetworkAdapter使用する必要があります。プライベートメンバーをパブリックに変更して、コンシューマークラスがアクセスできるようにしました。objectyield

public class NetworkAdapter
{
    public string Name {get; set;}
    public string Id  {get; set;}        
    public string Description  {get; set;}
    public string IpAddress  {get; set;}
    public string GatewayIpAddress  {get; set;}
    public string Speed  {get; set;}
    public string NetworkInterfaceType  {get; set;}
    public string MacAddress  {get; set;}

    public IEnumerable<NetworkAdapter> getAdapterInfo()
    {
        NetworkAdapter na = null;
        foreach (NetworkInterface adapter in NetworkInterface.GetAllNetworkInterfaces())
        {
            IPInterfaceProperties properties = adapter.GetIPProperties(); //fetch network configuration properties
            foreach (IPAddressInformation uniCast in properties.UnicastAddresses)
            {
                if (!IPAddress.IsLoopback(uniCast.Address) && uniCast.Address.AddressFamily != AddressFamily.InterNetworkV6) //ignore loop-back addresses & IPv6 internet protocol family
                {
                    na = new NetworkAdapter{ 
                    Name = adapter.Name;
                    Id= adapter.Id;
                    Description= adapter.Description;
                    IpAddress= uniCast.Address.ToString();
                    GatewayIpAddress= adapter.NetworkInterfaceType.ToString();
                    Speed= adapter.Speed.ToString("#,##0");

                    NetworkInterfaceType = adapter.GetPhysicalAddress().ToString();
                    };

                    foreach (GatewayIPAddressInformation gatewayAddress in adapter.GetIPProperties().GatewayAddresses)
                    {
                        na.GatewayIpAddress = gatewayAddress.Address.ToString();
                    }
                }
            }
             yield return na ;
        }
    }
}
于 2012-12-08T11:18:07.683 に答える