아무렇지도 않게 내 주변을 두뇌에 괴롭 히면 누구든지 도움이 될 수 있는지 궁금하십니까?ViewModelBuilder 제네릭 캐스팅 문제
정말로 실망스러운 주조 문제를 얻는 것은 확실한 답을 얻을 수 있지만 제네릭 형식 유추 나 다른 것에 대한 제한된 이해로 인해 발생하고있을 것입니다. 사전에
감사합니다!
시나리오는 마법사 사이트의 "단계별"ViewModels입니다. 나는 각각에 대한 빌더 클래스를 만들고, IStepViewModel 콜렉션 인 저에게 다시 게시 된 단계를 위해 특정 빌더를 잡기 위해 팩토리를 사용합니다.
public interface IStepViewModelBuilderFactory
{
IStepModelBuilder<T> Create<T>(T stepViewModel) where T : IStepViewModel;
void Release<T>(IStepModelBuilder<T> stepViewModelBuilder) where T : IStepViewModel;
}
public interface IStepViewModel
{
}
public interface IStepModelBuilder<TStepViewModel> : IModelBuilder<TStepViewModel> where TStepViewModel : IStepViewModel
{
}
public class SpecificViewModelBuilder : IStepModelBuilder<SpecificStepViewModel>
{
}
public class SpecificStepViewModel: StepViewModel
{
}
public abstract class StepViewModel : IStepViewModel
{
}
실패한 테스트!
[Test]
public void TestResolution()
{
var factory = this.container.Resolve<IStepViewModelBuilderFactory>();
IStepViewModel viewModel = new SpecificStepViewModel();
var builder = factory.Create(viewModel); // Here
Assert.That(builder, Is.Not.Null);
}
문제가 발생했습니다. 를 입력 유형 'Company.Namespace.SpecificViewModelBuilder'의 개체를 캐스팅 할 수
수 없습니다 'Company.Namespace.Builders.IStepModelBuilder`1 [Company.Namespace.IStepViewModel].
container.AddFacility<TypedFactoryFacility>(); .... container .Register( Classes .FromAssemblyContaining<StepViewModelSelector>() .BasedOn<StepViewModelSelector>()); container .Register( Component .For<IStepViewModelBuilderFactory>() .AsFactory(c => c.SelectedWith<StepViewModelSelector>()));
스택 트레이스 : Castle.Windsor
이러한public class StepViewModelSelector : DefaultTypedFactoryComponentSelector { protected override Type GetComponentType(System.Reflection.MethodInfo method, object[] arguments) { var arg = arguments[0].GetType(); var specType = typeof(IModelBuilder<>).MakeGenericType(arg); return specType; } }
등록하여 다음
공장 IMPL로
System.InvalidCastException 사용자 코드에 의해 처리되지 않은 하였다
HResult = -21 47467262 Message = 'Company.Namespace.SpecificViewModelBuilder'유형의 객체를 캐스팅하여 'Company.Namespace.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'을 입력 할 수 없습니다. 자료 = DynamicProxyGenAssembly2 스택 트레이스 \ 프로젝트 \ 인프라 \의 ViewModelBuilderFactoryTests.cs : 라인 61
C에서 Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution()에서 Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create [T (T stepViewModel) 에서 의 InnerException :
편집 : IModelBuilder<T>
인터페이스
IModelBuilder<T>
당신이 여기에 표시되지 않는 하나의 인터페이스가 있습니다
public interface IModelBuilder<TViewModel>
{
TViewModel Build();
TViewModel Rebuild(TViewModel model);
}
해당 팩토리의 Create 메소드 구현 중에 오류가 발생하는 것처럼 보입니다. 제발 그걸 제공해 줄 수 있니? – br1
저는 Castle.Windsor의 typed factory impl을 사용하고 있습니다. 사용하는 필터 선택기에 추가하십시오. – M05Pr1mty
괜찮 으면 예외의 .ToString() 덤프를 추가하십시오. 스택 트레이스를보고 싶습니다. – br1