나는 A<TInput, TOutput>
클래스의 특수화 클래스 인 B
의 인스턴스를 가지고 있습니다. 클래스 B
의 여러 변형이 있습니다. 다양한 입력 및 출력으로 구현 했으므로.제네릭을 사용하여 클래스에 객체 캐스트
TInput
및 TOutput
은 특정 입력 및 출력 클래스에 제약이 있으므로 I
및 O
이라고합시다.
Activator.CreateInstance을 사용하여 B
을 인스턴스화하고 있지만 개체를 반환하기 때문에 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);
는이 일을 할 수 있습니까? 고맙습니다! 나는 주어진 해답을 기반으로
편집, 나는 크게 공분산에 따라 코드를 구조 조정하여이 문제를 해결했습니다
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);
이 주셔서 감사합니다 : 나는 인터페이스에
A
에서
Foo
이동 나와 함께 당신의 통찰력을 공유하십시오!
알겠습니다! 그것은 의미가 있습니다.이제 'I'유형이 있다면 시나리오를 바꿀까요? – Leonard
이 경우 나는 'I'의 전문화를 의미합니다. 이것은 아마도 복잡한 패턴으로 클래스를 서로 연관시키는 수단으로 주석을 사용하려는 시도입니다. – Leonard
@ Zanathel : 죄송합니다. 이전에 이러한 의견을 놓쳤습니다. 'I'에 대한 차이가 필요 없다면, 더 간단 할 것입니다. 예 - 공분산은 일반적인 제약 ('TOutput : O')에 의해 도움을 받지만 반동은 그렇지 않습니다. –