创建从abstact基类继承的类实例的新类实例/重置类实例

时间:2016-02-22 10:45:03

标签: c# reflection

之前我想为长标题道歉,但我没想出更短的版本。

我有一个抽象基类,它提供了通用方法来访问测试类中的函数,这些函数派生自我的基类。

我有一组类本身可以引用这些测试类。

结构是:

// 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。

2 个答案:

答案 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>