0

3 つのクラスがあります。1 つの基本クラスは、インターフェイスを実装する必要があるジェネリック型を受け取る抽象クラスのサブクラスである必要があるジェネリック型を受け取ります。

テストのために、抽象クラスのサブクラスとインターフェイスの実装を提供する基本クラスを開始するフォームがあります。これが私のクラス宣言であり、基本クラスのコンストラクターへの呼び出しです。

    public class BaseClass<AC_IC> where AC_IC : AbstractClass<InterfaceClass>

    public abstract class AbstractClass<IC> where IC: InterfaceClass

    public interface InterfaceClass

    public class ExtendsAbstractClass<II> : AbstractClass<InterfaceClass>

    public class ImplementsInterface : InterfaceClass

    vBC = new BaseClass<ExtendsAbstractClass<ImplementsInterface>>();

次の呼び出しを使用して、BaseClass と AbstractClass 内から継承/実装クラスの両方のインスタンスを作成できると信じていました (コンストラクターにパラメーターを持つクラスは 1 つだけです)。

    (AC_IC) Activator.CreateInstance(typeof(AC_IC), new object[] { vParameter});
    (II) Activator.CreateInstance(typeof(II));

編集: 上記の呼び出しは BaseClass と AbstractClass 内にあるため、後で使用するクラスがわからないため、クラス名で指定することはできません。実装の範囲には、さまざまなクラスのペアが多数存在する可能性があります。

これらのコンストラクター呼び出しの両方で、「抽象クラスのインスタンスを作成できません」および「インターフェースのインスタンスを作成できません」というエラーが発生します。whereジェネリック型として渡すクラスが句内のクラスのサブクラスであるため、作成できることをコンパイラに知らせるにはどうすればよいですか。

任意のアイデア コミュニティ???

4

1 に答える 1

1

エラーはそれ自体を物語っています。抽象型のインスタンスを作成することはできません。

結果の型を基本型にキャストできます

 (AC_IC) Activator.CreateInstance(
         typeof(BaseClass<ExtendsAbstractClass<ImplementsInterface>), 
         new object[] { vParameter});

編集:

public TFinal MakeMeA<TOuter,TInner,TInnermost,TFinal>(params object[] additionalCrap)
{
    // figure out innermost type
    var innermostType = typeof(TInner).MakeGenericType(typeof(TInnermost));
    // work outwards
    var nextLevel = typeof(TOuter).MakeGenericType(innermostType);
    // figure out what the heck we're making
    var returnType = typeof(TFinal).MakeGenericType(nextLevel);

    // And make one of those    
    return (TFinal)Activator.CreateInstance(returnType, additionalCrap);
}
于 2013-01-14T19:41:24.613 に答える