是否可以在程序集中创建所有 类 的实例?

Is it possible to create instances of all classes in an assembly?

我有一个创建和导出 .dll 的应用程序,其中包含 WPF 表单的自定义图标。

我正在尝试创建一种探索性测试,我可以在其中打开一个应用程序,然后选择 .dll。一旦我选择了 .dll,它将查看它的内部并在其中创建每个 class 的实例,然后将这些对象添加到表单中。

我希望能够将其作为快速测试来执行此操作,以查看 .dll 中的所有图标在发送给客户之前是否正确显示。

我可以通过以下方式获取 .dll 中的所有类型:

var assembly = Assembly.LoadFrom(fileDialog.FileName);

foreach (var type in assembly.DefinedTypes)
{
   Console.WriteLine(type);
}

我想知道是否有可能以某种方式使用它来创建对象。

简单的解决方案是使用 .NET Activator class。它正在使用反射,但由于您希望创建此对象用于测试目的,我认为开销不会对您产生影响。
您可以像这样使用 Activator:

Type type = typeof(SomeClass);
object obj = Activator.CreateInstance(type);

如果您需要创建构造函数需要一些参数的对象,您可以调用接受参数的重载 CreateInstance:

Type type = typeof(SomeClass);
object obj = Activator.CreateInstace(type, new object[] {"arg1", "arg2"});

CreateInstance 方法将 return 对象,但您始终可以转换为所需的类型(如果您知道的话),这样您就可以轻松地对新创建的对象执行一些操作。或者,您可以调用方法,使用反射设置属性。

您可以在 MSDN 上阅读有关 Activator 的更多信息。

通常您并不是真的对创建所有类型感兴趣,您想要创建实现特定接口或子class 特定 class:

的类型
Type baseType = typeof(... someting ...);
Assembly assembly = ... your assembly ...;

foreach (Type type in assembly.GetTypes())
{
    // If type implements/subclasses baseType
    if (baseType.IsAssignableFrom(type))
    {
        // If there is a public parameterless constructor
        if (type.GetConstructor(Type.EmptyTypes) != null)
        {
            IMyInterface obj = (IMyInterface)Activator.CreateInstance(type)
        }
    }
}