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

标签 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();

但是我如何将它们转换到设备?编译器不允许直接转换,其他一切都会引发错误的类型异常。谢谢!

最佳答案

您的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/

相关文章:

java - 如何获取实例变量的引用?

c# - 如何使用反射为对象的所有 DateTime 属性设置 DateTime.Kind

c# - C# 处理 XML 中的 NullReferenceException

c# - 用 C# 录制视频

c# - Toast 通知不起作用

c# - 上传前压缩 iPhone 图像

c# - 什么时候应该使用 public、private 或 [SerializeField]?统一 C#

c# - 从终结器处理时,只读字段变为空

xamarin.ios - 我可以使MonoDevelop在Retina显示器上看起来不错吗?

scala - 从 Scala 宏访问代码文件和行号?