我有一个 class 的实例B
,它是一个抽象类的特化A<TInput, TOutput>
。class 有几种变体B
,因为我已经用各种输入和输出实现了它。
TInput
并且TOutput
受限于特定的输入和输出类,我们称它们为I
and O
。
我正在B
使用Activator.CreateInstance进行实例化,但由于它返回一个对象,我需要将其转换为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);
感谢您与我分享您的见解!