개념 증명으로 간단한 "버스"를 만들고 있습니다. 나는 복잡한 것을 필요로하지 않지만 다음 코드를 최적화하는 것이 최선인지 궁금합니다. 나는 오픈 제네릭으로 명령을 해결하기 위해 컨테이너로 Autofac을 사용하고 있지만 들어오는 명령을 코드의 구체적인 유형으로 캐스팅 할 수 없으므로 실제로 명령을 실행하는 것은 현재 리플렉션을 통해 수행 중입니다. 코드 참조 - // BEGIN // END로 마크 업 됨 - 현재 리플렉션으로 수행 중입니다. 리플렉션을 사용하지 않고이를 수행 할 수있는 방법이 있습니까?이 코드 조각에서 리플렉션 호출을 제거하려면 어떻게해야합니까?
// IoC wrapper
static class IoC {
public static object Resolve(Type t) {
// container gubbins - not relevant to rest of code.
}
}
// Handler interface
interface IHandles<T> {
void Handle(T command);
}
// Command interface
interface ICommand {
}
// Bus interface
interface IBus {
void Publish(ICommand cmd);
}
// Handler implementation
class ConcreteHandlerImpl : IHandles<HelloCommand> {
public void Handle(HelloCommand cmd) {
Console.WriteLine("Hello Command executed");
}
}
// Bus implementation
class BusImpl : IBus {
public void Publish(ICommand cmd) {
var cmdType = cmd.GetType();
var handler = IoC.Resolve(typeof(IHandles<>).MakeGenericType(cmdType));
// BEGIN SLOW
var method = handler.GetType().GetMethod("Handle", new [] { cmdType });
method.Invoke(handler, new[] { cmd });
// END SLOW
}
}
지금 일반 제약 조건 추가 및 테스트 - 답장을 보내 주셔서 감사합니다. 성공과 함께 게시됩니다 (희망 사항). – Deleted
우수 - 정말 고마워요. 완벽하게 작동합니다! 제약 조건이 런타임이나 컴파일러를 손상시키지 않고 강제로 유형을 허용하는 방법을 알 수 있습니다. 좋은 해결책. 다시 한번 감사드립니다. – Deleted
흠 ... 여기 뭔가가 빠졌습니까? 왜 그냥'var handler = IoC.Resolve>();'? 당신은 이미'T' 타입을 알고 있습니다 ... 제네릭 타입을 동적으로 만들 필요가 없습니다 ... –