我有一个创建并导出.dll
的应用程序,其中包含WPF表单的自定义图标。
我正在尝试创建一种探索性测试,我可以打开一个应用,然后选择一个.dll
。一旦我选择了.dll
,它将查看它并在其中创建每个类的实例,然后将这些对象添加到表单中。
我希望能够做到这一点作为快速测试,看到.dll
中的所有图标在发送给客户之前都能正确显示。
我能够通过以下方式获取.dll
内的所有类型:
var assembly = Assembly.LoadFrom(fileDialog.FileName);
foreach (var type in assembly.DefinedTypes)
{
Console.WriteLine(type);
}
我想知道是否有可能以某种方式使用它来创建对象。
答案 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)
}
}
}