Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建新类实例/重置从Absact基类继承的类实例的类实例_C#_Reflection - Fatal编程技术网

C# 创建新类实例/重置从Absact基类继承的类实例的类实例

C# 创建新类实例/重置从Absact基类继承的类实例的类实例,c#,reflection,C#,Reflection,在此之前,我想为长标题道歉,但我没有想出一个较短的版本 我有一个抽象基类,它提供了访问测试类中的函数的通用方法,这些测试类派生自我的基类 我有一个类集合,它本身有一个对这些测试类的引用 结构是: // A really simplified example for my manager Collection<AbstractBaseClass> Manager = new Collection<AbstractBaseClass> { TestClassA();

在此之前,我想为长标题道歉,但我没有想出一个较短的版本

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

我有一个类集合,它本身有一个对这些测试类的引用

结构是:

// A really simplified example for my manager
Collection<AbstractBaseClass> Manager = new Collection<AbstractBaseClass> 
{
    TestClassA();
    TestClassB();
}
我已经被绊倒了,但是这不起作用,因为CreateInstance不是System.Activator的成员。我也找不到ObjectType类

长时间的解释,短时间的问题:如何从我只有一个实例的类中创建一个新实例


非常感谢,ADP。

如果您知道所有类都有一个公共的无参数构造函数,您可以执行以下操作:

manager[i] = (AbstractBaseClass)Activator.CreateInstance(manager[i].GetType());

虽然您可以使用
Activator.CreateInstance
从给定类型创建实例,但也许您可以使用泛型以更优化的方式解决此问题:


现在,您已经创建了一个新的
Test
实例,没有对索引
1
进行反射,您仍然可以使用
TestCollectin
索引器
manager[1]访问键入为
Test
的新对象

如果类型
t
仅在运行时已知,则无法构造该类型的实例。
Activator
类有一个方法
CreateInstance
。提到在代码中搜索输入错误/缺少的引用。您需要使用。您应该能够找出您拥有的对象的实际类型。但老实说,看起来你在设计一些东西,应该有更简单的方法来做事情。如果你描述一下你想要达到的目标,可能会有一个更简单的解决方案。真奇怪!我关闭了IDE,再次打开,错误消失了。我已经试了三次,但都没有改变。。。。VS2015充满了漏洞,太可怕了@我想你是对的。我的问题是,我的程序从来没有打算重复任何东西。但是我的老板进来说“我们可以重复”……谢谢你,李,这就是解决办法。我之前试过3次,但是一个VS2015 IDE错误把它搞糟了…@AllDayPiano我会看看我的答案。这似乎需要更多的努力,但不应该超过10分钟,你会避免反思。嗨,Matías。这也是我已经找到的解决方案。不幸的是,我的项目已经取得了巨大的进展,这样改变它将花费巨大的努力。我把问题简化了。事实上,在我的问题中,这种形式并没有像postet这样的集合。这个集合是另一个包含其他课程的课程,在那里的某个地方是我的参考:)@AllDayPiano好吧,那么你需要在你的问题上更具体一些…:\顺便说一句,我将把这个答案留给未来的读者。我很抱歉,如果你理解我的答案,就好像我不需要它一样。当然,这次可能不会,但总的来说,这是一个非常好的主意,我会把它添加到书签中,以防将来需要类似的东西。然而,根据我的经验,最好将问题减少到3个LOC,而长时间的解释总是会导致长时间的讨论。所以我希望你能理解我:)@AllDayPiano没问题!!;)因此,不仅要回答OP,还要为未来的访问者提供高质量的答案。对我来说没关系
manager[i] = (AbstractBaseClass)Activator.CreateInstance(manager[i].GetType());
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());
} 
TestCollection<AbstractBaseClass> manager = new TestCollection<AbstractBaseClass>();
manager.Add(new Test());
manager.Add(new Test());
manager.Add(new Test());

manager.NewAt(1);