0

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

public class BaseClass
{
    internal BaseClass()
    {
    }
}

在另一个程序集中,我想用以下方式实例化这个类:

BaseClass c = new BaseClass();

我收到 CS0143 错误。

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

public class DerivedClass : BaseClass
{
}

但同样的错误。

BaseClass 未密封。如何实例化此类或派生类?当然,我不能修改BaseClass。

4

3 回答 3

2

您必须使用反射来获取内部构造函数并调用它:

var ci = typeof(BaseClass).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
var instance = (BaseClass)ci.Invoke(new object[0]);

由于仅在运行时才发现构造函数的存在,因此如果BaseClass更改或删除构造函数,则此方法将中断。

于 2012-12-07T18:19:44.697 回答
1

It's hard to tell from your question if DerivedClass is in the same assembly as BaseClass. If it is, just instantiate the derived class:

BaseClass c = new DerivedClass();

And, like Branko stated, if you have control of the project in which BaseClass lives, you can use InternalsVisibleTo.

于 2012-12-07T18:26:23.067 回答
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();}
}
于 2012-12-07T18:19:36.317 回答