之前我想为长标题道歉,但我没想出更短的版本。
我有一个抽象基类,它提供了通用方法来访问测试类中的函数,这些函数派生自我的基类。
我有一组类本身可以引用这些测试类。
结构是:
// A really simplified example for my manager
Collection<AbstractBaseClass> Manager = new Collection<AbstractBaseClass>
{
TestClassA();
TestClassB();
}
现在我想到了我需要在测试类的集合中杀死并重新创建实例,而不知道该集合中的哪个测试类。
我试着做某事。喜欢(伪代码)
Manager[0] = null;
Manager[0] = new (object)Manager[0].GetType();
我已经偶然发现Get a new object instance from a Type但是 - 但是 - 不起作用,因为 CreateInstance不是System.Activator 的成员。另外,我找不到 ObjectType 类。
冗长的解释,简短的问题:我怎样才能从只有实例的类中创建一个新实例?
非常感谢,ADP。
答案 0 :(得分:1)
如果您知道所有类都有公共无参数构造函数,则可以执行以下操作:
manager[i] = (AbstractBaseClass)Activator.CreateInstance(manager[i].GetType());
答案 1 :(得分:1)
虽然您可以使用Activator.CreateInstance
从给定类型创建实例,但也许您可以使用泛型以更优化的方式解决此问题:
public sealed class TestCollection<T> : ICollection<T>
where T : AbstractBaseClass, new()
{
private List<T> Tests { get; } = new List<T>();
public T this[int index] => Tests[index];
public void Add(T test) => Tests.Add(test);
// Rest of ICollection<T> members
public void NewAt(int testIndex) => Tests[testIndex].Insert(testIndex, new T());
}
现在您不再需要反射,因为T
必须是具有公共无表情构造函数的类:
TestCollection<AbstractBaseClass> manager = new TestCollection<AbstractBaseClass>();
manager.Add(new Test());
manager.Add(new Test());
manager.Add(new Test());
manager.NewAt(1);
现在,您已经创建了Test
的新实例而没有对索引1
进行反映,您仍然可以使用{{1}访问键入为Test
的新对象} indexer:TestCollectin<T>
。