是否可以在程序集中创建所有 类 的实例?
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)
}
}
}
我有一个创建和导出 .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)
}
}
}