使用内部构造函数实例化一个类(或派生类)

时间:2012-12-07 18:12:40

标签: c#

假设我在程序集中定义了一个类:

public class BaseClass
{
    internal BaseClass()
    {
    }
}

在另一个集会中,我想用以下方式实现这个课程:

BaseClass c = new BaseClass();

我收到了CS0143错误。

尝试另一种方式,我尝试创建第一个派生类:

public class DerivedClass : BaseClass
{
}

但同样的错误。

BaseClass没有密封。如何实例化此类或派生类?当然,我无法修改BaseClass。

3 个答案:

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

相关问题