我有一个抽象类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();
但我如何将它们投射到Device
?编译器不允许直接强制转换,其他所有内容都会抛出错误的类型异常。谢谢!
答案 0 :(得分:2)
您的deviceTypes
列表包含类型(类定义),而不包含类实例。因此,在将它们转换为Device
之前,您需要创建它们的实例。
如果他们有无参数构造函数,您可以使用:
List<Device> devices = new List<Device>();
foreach (Type deviceType in deviceTypes)
{
devices.Add((Device)Activator.CreateInstance(deviceType));
}
如果其中一个类确实需要构造函数参数,那么可能很难弄清楚如何提供这些参数。
答案 1 :(得分:0)
您可以使用这样的方法从所有程序集中搜索。
next(filter(lambda x: x.val == value, my_unfiltered_list)) # Optionally: next(..., None) or some other default value to prevent Exceptions
答案 2 :(得分:0)
已解决:问题是我有module.exports = function (config) {
config.set({
basePath: '.',
frameworks: ['jasmine'],
files: [
'../../ClientApp/**/*.spec.ts'
],
个构造函数,而internal
无法创建该类的实例。