我有一个抽象类Device
。许多类从它派生出来,代表特定的设备。所以我们有,例如class RedDevice : Device
、class BlueDevice : Device
等。它们都存储在 Foo.Devices
命名空间下。以下是结构概述:
- Foo
| ↳ Devices (folder)
| | ↳ RedDevice
| | ↳ BlueDevice
| ↳ Device
Device.cs
:
internal abstract class Device
{
internal string Path { get; set; }
}
RedDevice.cs
:
class RedDevice
{
internal RedDevice()
{
this.Path = "/path";
}
}
我想创建一个包含 Foo.Devices
下所有设备的列表,并将其转换为它们的父类 Device
。我可以使用以下代码获取 Type
列表:
List<System.Type> deviceTypes =
Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace ==
typeof(RedDevice).Namespace).ToList();
但是我如何将它们转换到设备
?编译器不允许直接转换,其他一切都会引发错误的类型异常。谢谢!
最佳答案
您的deviceTypes
列表包含类型(类定义),而不是类实例。因此,在将它们转换到 Device
之前,您需要创建它们的实例。
如果它们有无参数构造函数,您可以使用:
List<Device> devices = new List<Device>();
foreach (Type deviceType in deviceTypes)
{
devices.Add((Device)Activator.CreateInstance(deviceType));
}
如果其中一个类确实需要构造函数参数,则可能很难弄清楚如何提供这些参数。
关于c# - 使用反射创建命名空间中所有类的列表并转换为其真实类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957326/