Я использую DictionaryBase для сбора объектов.Но я не могу получить методы подкласса (HardDrive.cs) только суперкласс, абстрактные методы DeviceInfo, такие как .Named ();
Класс HardDrive: DeviceInfo
deviceCollection = DictionaryBase
Я пытаюськ использованию методов HardDrive, таких как Freespace, Size и т. д.
Например, он работал:
deviceCollection["Western Digital"].Named(); // Superclass method: Named
Не работает:
deviceCollection["Western Digital"].Size(); // Subclass method: Size
Я не знаю, чтоВозможно ли это преобразовать в подкласс или около того?
Заранее благодарим.
Имя файла: DeviceInfo.cs
using System;
using System.Management;
using System.Windows.Forms;
namespace TestHarnessHardDrives
{
public abstract class DeviceInfo
{
protected string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
}
}
public DeviceInfo()
{
name = "The device with no name";
}
public DeviceInfo(string newName)
{
name = newName;
}
public void Named()
{
Console.WriteLine("{0} has been named.", name);
}
}
}
Имя файла: HardDrive.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestHarnessHardDrives
{
class HardDrive: DeviceInfo
{
// properties
private ulong _size;
private ulong _freespace;
private string _volumeSerialNumber;
private string _filesystem;
//methods
// VolumeName + Caption
public HardDrive(string newName, ulong newSize): base(newName)
{
_size = newSize;
}
// Freespace
public ulong Freespace
{
get
{
return _freespace;
}
set
{
_freespace = value;
}
}
// Size
public ulong Size
{
get
{
return _size;
}
set
{
_size = value;
}
}
// VolumeSerialNumber
public string VolumeSerialNumber
{
get
{
return _volumeSerialNumber;
}
set
{
_volumeSerialNumber = value;
}
}
// Filesystem
public string Filesystem
{
get
{
return _filesystem;
}
set
{
_filesystem = value;
}
}
}
}
имя файла: Devices.cs
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestHarnessHardDrives
{
class Devices: DictionaryBase
{
public void Add(string newID, DeviceInfo newDevice)
{
Dictionary.Add(newID, newDevice);
}
public void Remove(string newID, DeviceInfo oldDevice)
{
Dictionary.Remove(oldDevice);
}
public Devices()
{
}
public DeviceInfo this [string deviceID]
{
get
{
return (DeviceInfo)Dictionary[deviceID];
}
set
{
Dictionary[deviceID] = value;
}
}
public new IEnumerator GetEnumerator()
{
foreach (object device in Dictionary.Values)
yield return (DeviceInfo)device;
}
}
}
.... основная программа
Filename: Program.cs
using System;
using System.Management;
using System.Windows.Forms;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace TestHarnessHardDrives
{
class Program
{
public static Devices deviceCollection = new Devices();
static void getHardDrives()
{
string keyHDDName;
try
{
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\CIMV2",
"SELECT * FROM Win32_LogicalDisk");
deviceCollection.Add("Western Digital", new HardDrive("Western Digital",100000));
foreach (ManagementObject queryObj in searcher.Get())
{
if (queryObj["Description"].Equals("Local Fixed Disk"))
{
Console.WriteLine("Description: {0}", queryObj["Description"]);
keyHDDName = queryObj["VolumeName"].ToString() + " "
+ queryObj["Caption"].ToString();
deviceCollection.Add(keyHDDName, new HardDrive(keyHDDName, 100000));
};
// Console.WriteLine("FileSystem: {0}", queryObj["FileSystem"]);
// Console.WriteLine("FreeSpace: {0}", queryObj["FreeSpace"]);
// Console.WriteLine("Size: {0}", queryObj["Size"]);
// Console.WriteLine("VolumeSerialNumber: {0}", queryObj["VolumeSerialNumber"]);
}
}
// deviceCollection.Add(new SystemInterface("Western Digital"));
catch (ManagementException e)
{
MessageBox.Show("An error occurred while querying for WMI data: " + e.Message);
}
}
static void Main(string[] args)
{
Console.WriteLine("Create an Array type Collection of DeviceInfo " +
"objects and use it");
getHardDrives();
foreach (DeviceInfo myDevices in deviceCollection)
{
myDevices.Named();
myDevices.GetType();
}
deviceCollection["Western Digital"].Named();
Console.ReadKey();
}
}
}