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);