假设我在程序集中定义了一个类:
public class BaseClass
{
internal BaseClass()
{
}
}
在另一个集会中,我想用以下方式实现这个课程:
BaseClass c = new BaseClass();
我收到了CS0143错误。
尝试另一种方式,我尝试创建第一个派生类:
public class DerivedClass : BaseClass
{
}
但同样的错误。
BaseClass没有密封。如何实例化此类或派生类?当然,我无法修改BaseClass。
答案 0 :(得分:2)
您必须使用反射来获取内部构造函数并调用它:
var ci = typeof(BaseClass).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
var instance = (BaseClass)ci.Invoke(new object[0]);
由于构造函数的存在仅在运行时被发现,因此如果BaseClass
的构造函数被更改或删除,此方法将会中断。
答案 1 :(得分:1)
1)你想要一个基类的实际实例:
在程序集中需要有一些方法可以为你构造它。这通常被称为“工厂”。它可能看起来像这样:
public class BaseFactory
{
public static BaseClass Create() { return new BaseClass(); } //may also add other creation logic
}
请注意,这样的创建方法甚至可以在BaseClass
本身,也可以在另一个类中。 (如果构造函数是私有的,则需要在类本身中。)
2)你想要一个派生类的实例。 (也许你不是假设能够构建基类。如果这是真的,它可能应该是abstract
。)
public class Derived : BaseClass { }
public class Foo
{
public void Bar() { Derived d = new Derived();}
}
答案 2 :(得分:0)
很难从您的问题中判断DerivedClass
是否与BaseClass
在同一个程序集中。如果是,只需实例化派生类:
BaseClass c = new DerivedClass();
而且,和Branko说过,如果您掌握了BaseClass所在的项目,您可以使用InternalsVisibleTo。