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

时间:2015-05-21 09:52:05

标签: c# dll

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

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

我希望能够做到这一点作为快速测试,看到.dll中的所有图标在发送给客户之前都能正确显示。

我能够通过以下方式获取.dll内的所有类型:

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

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

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

2 个答案:

答案 0 :(得分:2)

简单的解决方案将使用.NET Activator类。它正在使用反射,但由于你想创建这个对象用于测试目的,我不认为开销会对你产生影响。
您可以像这样使用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方法将返回对象,但您始终可以转换为所需的类型(如果您知道的话),这样您就可以轻松地对新创建的对象执行某些操作。或者,您可以调用方法,使用反射设置属性。

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

答案 1 :(得分:0)

通常,您对创建所有类型并不感兴趣,您希望创建实现某个接口的类型或者是某个类的子类:

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)
        }
    }
}