B
抽象クラスの特殊化であるクラスのインスタンスがありますA<TInput, TOutput>
。B
さまざまな入力と出力を使用して実装したため、クラスにはいくつかのバリエーションがあります。
TInput
そして、特定の入力クラスと出力クラスに制約されているので、それらをととTOutput
呼びましょう。I
O
Activator.CreateInstanceB
を使用してインスタンス化していますが、オブジェクトが返されるため、にキャストする必要があります。これが基本クラス(この場合)として機能することを期待しています。A<I, O>
I
O
B<SpecialisationOfI, SpecalisationOfO>
このキャストは明らかに無効であるため、これは失敗する場所です。
擬似コード:
abstract class I { }
abstract class O { }
abstract class A<TInput, TOutput>
where TInput : I
where TOutput : O
{
abstract TOutput Foo(TInput bar);
}
class Input : I { }
class Output : O { }
class B : A<Input, Output> { }
A<I, O> instance = (A<I, O>)Activator.CreateInstance(typeOfB); // <-- fail
instance.Foo(input);
これを機能させることは可能ですか?ありがとうございました!
編集私が与えられた答えに基づいて、共分散に基づいてコードを大幅に再構築することでこれを解決しました:私はインターフェイスに移動Foo
しました:A
interface IA<TResult> {
TResult Foo(object input);
}
class A<TInput, TOutput> : IA<TOutput>
where TInput : I
where TOutput : O {
public TOutput Foo(object input) {
if (!(input is TInput)) {
throw new ArgumentException("input");
}
return FooImpl(input as TInput);
}
protected abstract TOutput FooImpl(TInput input);
}
var instance = (IA<Output>) Activator.CreateInstance(type);
instance.Foo(input);
私とあなたの洞察を共有してくれてありがとう!