使用反射创建命名空间中所有类的列表并转换为其实际类型

时间:2017-10-26 14:43:19

标签: c# xamarin reflection

我有一个抽象类Device。许多类派生自它,代表特定的设备。所以我们有,例如, class RedDevice : Deviceclass 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?编译器不允许直接强制转换,其他所有内容都会抛出错误的类型异常。谢谢!

3 个答案:

答案 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无法创建该类的实例。