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

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 に答える
1

DerivedClassがと同じアセンブリにあるかどうかを質問から判断するのは困難BaseClassです。そうである場合は、派生クラスをインスタンス化するだけです。

BaseClass c = new DerivedClass();

また、Brankoが述べたように、BaseClassが存在するプロジェクトを管理している場合は、InternalsVisibleToを使用できます。

于 2012-12-07T18:26:23.067 に答える