Obijanie mojego mózgu wokół tego bez skutku, zastanawiam się, czy ktoś może być pomocny?ViewModelBuilder generics casting issue
Uzyskanie naprawdę frustrującego problemu z castingiem, który na pewno będzie miał szybką odpowiedź, ale prawdopodobnie dzieje się tak po prostu ze względu na moje ograniczone zrozumienie ogólnego rodzaju wnioskowania lub coś takiego.
Z góry dziękuję!
Scenariusz to liczba modeli ViewModels "Step" dla witryny kreatora. Tworzę klasy Buildera dla każdego z nich i używam fabryki, aby pobrać konkretny program budujący dla kroku, który został wysłany do mnie, co jest kolekcją 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
{
}
Awaria testu!
[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);
}
Problem!
nie można rzutować obiektu typu 'Company.Namespace.SpecificViewModelBuilder' wpisać 'Company.Namespace.Builders.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]'.
Fabryka IMPL następująco użyciu 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;
}
}
rejestracji to:
container.AddFacility<TypedFactoryFacility>();
....
container
.Register(
Classes
.FromAssemblyContaining<StepViewModelSelector>()
.BasedOn<StepViewModelSelector>());
container
.Register(
Component
.For<IStepViewModelBuilderFactory>()
.AsFactory(c => c.SelectedWith<StepViewModelSelector>()));
StackTrace:
System.InvalidCastException był nieobsługiwany przez kod użytkownika
HResult = -21 47467262 Message = Nie można rzutować obiektu typu "Company.Namespace.SpecificViewModelBuilder", aby wpisać "Company.Namespace.IStepModelBuilder`1 [Company.Namespace.IStepViewModel]". Źródło = DynamicProxyGenAssembly2 StackTrace: w Castle.Proxies.IStepViewModelBuilderFactoryProxy.Create [T] (T stepViewModel) w Tests.Infrastructure.ViewModelBuilderFactoryTests.TestResolution() w c: \ \ Projekt infrastruktury \ ViewModelBuilderFactoryTests.cs: linia 61
InnerException:
EDIT: IModelBuilder<T>
interfejs
public interface IModelBuilder<TViewModel>
{
TViewModel Build();
TViewModel Rebuild(TViewModel model);
}
Wygląda na to, że błąd występuje wewnątrz implementacji metody Create tej fabryki. czy mógłbyś to dostarczyć? – br1
Po prostu używam fabryki Typed z Castle.Windsor - ill add w im selektorze filtra. – M05Pr1mty
ok, proszę dodać zrzut .ToString() wyjątku, jeśli możesz. Chciałbym zobaczyć ślad stosu – br1